MERGE (Transact-SQL) (Español)

  • 20/08/2019
  • 25 minutos de lectura
    • X
    • c
    • j
    • r
    • a
    • +18

Se aplica a: SQL Server (todas las versiones compatibles) Azure SQL Database Azure Synapse Analytics

Ejecuta operaciones de inserción, actualización o eliminación en una tabla de destino desde los resultados de una combinación con una tabla de origen. Por ejemplo, sincronice dos tablas insertando, actualizando o eliminando filas en una tabla según las diferencias encontradas en la otra tabla.

Nota

MERGE se encuentra actualmente en vista previa para Azure Synapse Analytics.

Sugerencia de rendimiento: el comportamiento condicional descrito para la instrucción MERGE funciona mejor cuando las dos tablas tienen una combinación compleja de características coincidentes. Por ejemplo, insertando una fila si no existe, o actualizando una fila si coincide. Cuando simplemente actualice una tabla basada en las filas de otra tabla, mejore el rendimiento y la escalabilidad con instrucciones básicas INSERT, UPDATE y DELETE. ejemplo:

Convenciones de sintaxis de Transact-SQL

Sintaxis

Nota

Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores, consulte la documentación de versiones anteriores.

Argumentos

WITH < common_table_expression >
Especifica la vista o el conjunto de resultados con nombre temporal, también conocido como expresión de tabla común, que se define dentro del alcance de la declaración MERGE. El conjunto de resultados se deriva de una consulta simple y es referenciado por la instrucción MERGE. Para obtener más información, consulte WITH common_table_expression (Transact-SQL).

TOP (expresión)
Especifica el número o porcentaje de filas afectadas. La expresión puede ser un número o un porcentaje de las filas. Las filas a las que se hace referencia en la expresión TOP no están organizadas en ningún orden. Para obtener más información, consulte TOP (Transact-SQL).

La cláusula TOP se aplica después de que toda la tabla de origen y toda la tabla de destino se unen y las filas unidas que no califican para una inserción, actualización o Se eliminan las acciones de eliminación. La cláusula TOP reduce aún más el número de filas unidas al valor especificado. Las acciones de inserción, actualización o eliminación se aplican a las filas unidas restantes de forma desordenada. Es decir, no hay ningún orden en el que las filas se distribuyen entre las acciones definidas en las cláusulas WHEN. Por ejemplo, especificar TOP (10) afecta a 10 filas. De estas filas, se pueden actualizar 7 y se pueden insertar 3, o se puede eliminar 1, actualizar 5 y insertar 4, etc.

Debido a que la instrucción MERGE realiza un escaneo completo de la tabla tanto de la fuente como tablas de destino, el rendimiento de E / S a veces se ve afectado cuando se usa la cláusula TOP para modificar una tabla grande creando varios lotes. En este escenario, es importante asegurarse de que todos los lotes sucesivos apunten a nuevas filas.

database_name
El nombre de la base de datos en la que se encuentra target_table.

schema_name
El nombre del esquema al que pertenece target_table.

target_table
La tabla o vista en la que se encuentran las filas de datos de < table_source > coinciden en función de < clause_search_condition >. target_table es el objetivo de cualquier operación de inserción, actualización o eliminación especificado por las cláusulas WHEN de la declaración MERGE.

Si target_table es una vista, cualquier acción en su contra debe satisfacer las condiciones para actualizar las vistas. Para obtener más información, consulte Modificar datos a través de una vista.

target_table no puede ser una tabla remota. target_table no puede tener reglas definidas.

table_alias
Un nombre alternativo para hacer referencia a una tabla para target_table.

USANDO < table_source >
Especifica la fuente de datos que «coincide con las filas de datos en target_table según la < merge_search condition >. El resultado de esta coincidencia dicta las acciones que deben tomar las cláusulas WHEN de la instrucción MERGE. < table_source > puede ser una tabla remota o una tabla derivada que accede a tablas remotas.

< table_source > puede ser una tabla derivada que usa el constructor de valores de tabla Transact-SQL para construir una tabla especificando múltiples filas.

table_alias
Un nombre alternativo para hacer referencia a una tabla para table_source.

Para obtener más información sobre la sintaxis y los argumentos de esta cláusula, consulte FROM (Transact-SQL).

ON < merge_search_condition >
Especifica las condiciones en las que < table_source > se une con target_table para determinar dónde coinciden.

Precaución

Es importante especificar solo las columnas de la tabla de destino para utilizar con fines de coincidencia. Es decir, especifique columnas de la tabla de destino que se comparan con la columna correspondiente de la tabla de origen. No intente mejorar el rendimiento de la consulta filtrando filas en la tabla de destino en la cláusula ON; por ejemplo, como especificar AND NOT target_table.column_x = value. Hacerlo puede devolver resultados inesperados e incorrectos.

CUANDO SE COINCIDEN ENTONCES < merge_matched >
Especifica que todas las filas de * target_table, que coinciden con las filas devueltas por < table_source > ON < merge_search_condition >, y satisfacen cualquier condición de búsqueda adicional, se actualizan o eliminan de acuerdo con < merge_matched > cláusula.

La sentencia MERGE puede tener, como máximo, dos cláusulas WHEN MATCHED. Si se especifican dos cláusulas, la primera cláusula debe ir acompañada de una cláusula AND < search_condition >. Para cualquier fila dada, la segunda cláusula WHEN MATCHED solo se aplica si la primera no es «t». Si hay dos cláusulas WHEN MATCHED, una debe especificar una acción UPDATE y la otra debe especificar una acción DELETE. Cuando UPDATE se especifica en el < merge_matched > cláusula y más de una fila de < table_source > coincide con una fila en target_table según < merge_search_condition >, SQL Server devuelve un error. La instrucción MERGE puede» t actualice la misma fila más de una vez, o actualice y elimine la misma fila.

CUANDO NO COINCIDA ENTONCES < merge_not_matched >
Especifica que se inserta una fila en target_table por cada fila devuelta por < table_source > ON < merge_search_condition > que no coincide con una fila en targ et_table, pero satisface una condición de búsqueda adicional, si está presente. Los valores para insertar se especifican en la cláusula < merge_not_matched >. La instrucción MERGE solo puede tener una cláusula WHEN NOT MATCHED.

CUANDO NO COINCIDEN POR SOURCE THEN < merge_matched >
Especifica que todas las filas de * target_table, que no «coinciden con las filas devueltas por < table_source > ON < merge_search_condition >, y que satisfacen cualquier condición de búsqueda adicional, se actualizan o eliminan de acuerdo con < merge_matched > cláusula.

La sentencia MERGE puede tener como máximo dos cláusulas WHEN NOT MATCHED BY SOURCE. Si se especifican dos cláusulas, la primera cláusula debe ir acompañada de una cláusula AND < clause_search_condition >. Para cualquier fila dada, la segunda cláusula WHEN NOT MATCHED BY SOURCE solo se aplica si la primera es » t. Si hay dos cláusulas WHEN NOT MATCHED BY SOURCE, una debe especificar una acción UPDATE y otra debe especificar una acción DELETE. Solo se puede hacer referencia a las columnas de la tabla de destino en < clause_search_condition >.

Cuando no se devuelven filas por < table_source >, no se puede acceder a las columnas de la tabla fuente. Si la acción de actualización o eliminación especificada en < merge_matched > la cláusula hace referencia a columnas en la tabla de origen, se devuelve el error 207 (nombre de columna no válido). Por ejemplo, la cláusula WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1 puede hacer que la declaración falle porque Col1 en la tabla fuente es inaccesible.

Y < clause_search_condition >
Especifica cualquier condición de búsqueda válida. Para obtener más información, consulte Condición de búsqueda (Transact-SQL).

< table_hint_limited >
Especifica una o más sugerencias de tabla para aplicar en la tabla de destino para cada uno de los e insertar, actualizar o eliminar acciones realizadas por la instrucción MERGE. La palabra clave WITH y los paréntesis son obligatorios.

No se permiten NOLOCK y READUNCOMMITTED. Para obtener más información sobre las sugerencias de tabla, consulte Sugerencias de tabla (Transact-SQL).

Especificar la sugerencia TABLOCK en una tabla que es el objetivo de una instrucción INSERT tiene el mismo efecto que especificar la sugerencia TABLOCKX. Se toma un bloqueo exclusivo en la tabla. Cuando se especifica FORCESEEK, se aplica a la instancia implícita de la tabla de destino unida con la tabla de origen.

Precaución

Especificar READPAST con WHEN NOT MATCHED THEN INSERT puede resultar en operaciones INSERT que violan las restricciones UNIQUE.

INDEX (index_val)
Especifica el nombre o ID de uno o más índices en la tabla de destino para realizar una combinación implícita con la tabla de origen. Para obtener más información, consulte Sugerencias de tabla (Transact -SQL).

< output_clause >
Devuelve una fila por cada fila en target_table que «s actualizado, insertado o eliminado, sin ningún orden en particular. $ action se puede especificar en la cláusula de salida. $ action es una columna de tipo nvarchar (10) que devuelve uno de los tres valores para cada fila: «INSERT», «UPDATE» o «DELETE», según la acción realizada en esa fila. Para obtener más información sobre los argumentos y el comportamiento de esta cláusula, consulte la cláusula OUTPUT (Transact-SQL).

< merge_matched >
Especifica la acción de actualización o eliminación que «se aplica a todas las filas de target_table que no» coinciden con las filas devueltas por < table_source > ON < merge_search_condition >, y que satisfacen cualquier condición de búsqueda adicional.

UPDATE SET < set_clause >
Especifica la lista de nombres de columnas o variables para actualizar en la tabla de destino y los valores con los que actualizarlos.

Para obtener más información sobre los argumentos de esta cláusula, consulte ACTUALIZACIÓN (Transact-SQL). No se admite la configuración de una variable con el mismo valor que una columna.

DELETE
Especifica que las filas que coinciden con las filas en target_table se eliminan.

< merge_not_matched >
Especifica los valores para insertar en la tabla de destino.

(column_list)
Una lista de uno o más columnas de la tabla de destino en las que insertar datos. Las columnas deben especificarse como un nombre de una sola parte o, de lo contrario, la instrucción MERGE fallará. column_list debe estar entre paréntesis y delimitado por comas.

VALUES ( lista_valores)
Una lista separada por comas de constantes, variables o expresiones que devuelven valores para insertar en la tabla de destino. Las expresiones no pueden contener una instrucción EXECUTE.

VALORES POR DEFECTO
Fuerza la fila insertada para contener los valores predeterminados definidos para cada columna.

Para obtener más información sobre esta cláusula, consulte INSERT (Transact-SQL).

< condición_de_búsqueda >
Speci Cumple las condiciones de búsqueda para especificar < merge_search_condition > o < clause_search_condition >. Para obtener más información sobre los argumentos de esta cláusula, consulte Condición de búsqueda (Transact-SQL).

< patrón de búsqueda de gráfico >
Especifica el patrón de coincidencia del gráfico. Para obtener más información sobre los argumentos de esta cláusula, consulte MATCH (Transact-SQL)

Observaciones

Nota

En Azure Synapse Analytics, el MERGE El comando (vista previa) tiene las siguientes diferencias en comparación con el servidor SQL y la base de datos SQL de Azure.

  • Una actualización MERGE se implementa como un par de eliminación e inserción. El recuento de filas afectadas para una actualización MERGE incluye las filas eliminadas e insertadas.
  • Durante la vista previa, las tablas con columna de identidad no son compatibles con el comando MERGE de Synapse SQL.
  • La compatibilidad con En esta tabla se describen tablas con diferentes tipos de distribución:
CLAUSULA DE FUSIÓN en Azure Synapse Analytics Tabla de distribución TARGE admitida Tabla de distribución SOURCE admitida Comentar
CUANDO COINCIDAN Todos los tipos de distribución Todos los tipos de distribución
NO COINCIDOS POR OBJETIVO HASH Todos los tipos de distribución Use UPDATE / DELETE FROM… JOIN para sincronizar dos tablas.
NO COINCIDE POR FUENTE Todos los tipos de distribución Todos los tipos de distribución

Se debe especificar al menos una de las tres cláusulas MATCHED, pero se pueden especificar en cualquier orden. Una variable no se puede actualizar más de una vez en la misma cláusula MATCHED.

Cualquier acción de inserción, actualización o eliminación especificada en la tabla de destino por la instrucción MERGE está limitada por las restricciones definidas en ella, incluidas las restricciones de integridad referencial en cascada. Si IGNORE_DUP_KEY está activado para cualquier índice único en la tabla de destino, MERGE ignora esta configuración.

La instrucción MERGE requiere un punto y coma (;) como terminador de instrucción. El error 10713 se genera cuando se ejecuta una instrucción MERGE sin el terminador.

Cuando se usa después de MERGE, @@ ROWCOUNT (Transact-SQL) devuelve el número total de filas insertadas, actualizadas y eliminadas al cliente.

MERGE es una palabra clave totalmente reservada cuando el nivel de compatibilidad de la base de datos se establece en 100 o más. La declaración MERGE está disponible en niveles de compatibilidad de bases de datos de 90 y 100; sin embargo, la palabra clave no está completamente reservada cuando el nivel de compatibilidad de la base de datos se establece en 90.

No use la instrucción MERGE cuando use la replicación de actualización en cola. El activador de actualización MERGE y en cola no son compatibles. Reemplace la instrucción MERGE con una instrucción de inserción o actualización.

Implementación de activación

Para cada acción de inserción, actualización o eliminación especificada en la instrucción MERGE, SQL Server dispara los disparadores AFTER correspondientes definidos en la tabla de destino, pero no garantiza qué acción disparar dispara primero o último. Los activadores definidos para la misma acción respetan el orden que especifique. Para obtener más información sobre cómo configurar el orden de activación de los activadores, consulte Especificar el primer y último activador.

Si la tabla de destino tiene un activador INSTEAD OF habilitado definido en ella para una acción de inserción, actualización o eliminación realizada por una instrucción MERGE , debe tener un desencadenador INSTEAD OF habilitado para todas las acciones especificadas en la instrucción MERGE.

Si se define algún desencadenante INSTEAD OF UPDATE o INSTEAD OF DELETE en target_table, las operaciones de actualización o eliminación no son En su lugar, los disparadores se activan y las tablas insertadas y eliminadas se rellenan en consecuencia.

Si se definen disparadores INSERT OF INSERT en target_table, la operación de inserción no se realiza. En su lugar, la tabla se rellena en consecuencia.

Permisos

Requiere el permiso SELECT en la tabla de origen y los permisos INSERT, UPDATE o DELETE en la tabla de destino. Para obtener más información, consulte la sección Permisos en los artículos SELECT, INSERT, UPDATE y DELETE.

Optimización del rendimiento de la declaración MERGE

Al usar la declaración MERGE, puede reemplazar el DML individual declaraciones con una sola declaración. Esto puede mejorar el rendimiento de la consulta porque las operaciones se realizan dentro de una sola declaración, por lo tanto, se minimiza el número de veces que se procesan los datos en las tablas de origen y destino. Sin embargo, las ganancias de rendimiento dependen de tener índices, uniones y otras consideraciones correctas.

Prácticas recomendadas para índices

Para mejorar el rendimiento de la declaración MERGE, recomendamos las siguientes pautas de índice :

  • Cree un índice en las columnas de combinación en la tabla de origen que sea único y cubra.
  • Cree un índice agrupado único en las columnas de combinación en la tabla de destino.

Estos índices aseguran que las claves de combinación sean únicas y que los datos de las tablas estén ordenados. El rendimiento de las consultas se mejora porque el optimizador de consultas no necesita realizar un procesamiento de validación adicional para ubicar y actualizar filas duplicadas y no se necesitan operaciones de clasificación adicionales.

Mejores prácticas de JOIN

Para mejorar la rendimiento de la declaración MERGE y asegurar que se obtengan resultados correctos, recomendamos las siguientes pautas de unión:

  • Especifique solo las condiciones de búsqueda en ON < merge_search_condition > cláusula que determina los criterios para la coincidencia de datos en las tablas de origen y destino. Es decir, especifique solo las columnas de la tabla de destino que se comparan con las columnas correspondientes de la tabla de origen.
  • No incluya comparaciones con otros valores como una constante.

Para filtrar filas de las tablas de origen o de destino, utilice uno de los siguientes métodos.

  • Especifique la condición de búsqueda para el filtrado de filas en la cláusula WHEN correspondiente. Por ejemplo, CUANDO NO SE COINCIDEN Y S.EmployeeName COMO «S%» ENTONCES INSERT ….
  • Defina una vista en el origen o destino que devuelva las filas filtradas y haga referencia a la vista como origen o destino. mesa. Si la vista se define en la tabla de destino, cualquier acción en su contra debe satisfacer las condiciones para actualizar las vistas. Para obtener más información sobre la actualización de datos mediante una vista, consulte Modificación de datos mediante una vista.
  • Utilice la cláusula WITH <common table expression> para filtrar filas de las tablas de origen o de destino . Este método es similar a especificar criterios de búsqueda adicionales en la cláusula ON y puede producir resultados incorrectos. Le recomendamos que evite utilizar este método o que lo pruebe a fondo antes de implementarlo.

La operación de combinación en la instrucción MERGE se optimiza de la misma manera que una combinación en una instrucción SELECT. Es decir, cuando SQL Server procesa uniones, el optimizador de consultas elige el método más eficiente (entre varias posibilidades) de procesar la unión. Cuando el origen y el destino son de tamaño similar y las pautas de índice descritas anteriormente se aplican a las tablas de origen y destino, un operador de combinación de combinación es el plan de consulta más eficiente. Esto se debe a que ambas tablas se escanean una vez y no es necesario ordenar los datos. Cuando la fuente es más pequeña que la tabla de destino, es preferible un operador de bucles anidados.

Puede forzar el uso de una combinación específica especificando la cláusula OPTION (<query_hint>) en la declaración MERGE. Recomendamos que no use la combinación hash como sugerencia de consulta para declaraciones MERGE porque este tipo de combinación no usa índices.

Mejores prácticas de parametrización

Si selecciona SELECT, INSERT, UPDATE , o la instrucción DELETE se ejecuta sin parámetros, el optimizador de consultas de SQL Server puede optar por parametrizar la instrucción internamente. Esto significa que los valores literales contenidos en la consulta se sustituyen por parámetros. Por ejemplo, la instrucción INSERT dbo.MyTable (Col1, Col2) VALUES (1, 10), puede implementarse internamente como INSERT dbo.MyTable (Col1, Col2) VALUES (@ p1, @ p2). Este proceso, llamado parametrización simple, aumenta la capacidad del motor relacional para hacer coincidir las nuevas declaraciones SQL con los planes de ejecución existentes previamente compilados. El rendimiento de las consultas se puede mejorar porque se reduce la frecuencia de las compilaciones y recompilaciones de consultas. El optimizador de consultas no aplica el proceso de parametrización simple a las declaraciones MERGE. Por lo tanto, las instrucciones MERGE que contienen valores literales pueden no funcionar tan bien como las instrucciones INSERT, UPDATE o DELETE individuales porque se compila un nuevo plan cada vez que se ejecuta la instrucción MERGE.

Para mejorar el rendimiento de la consulta, recomendamos las siguientes pautas de parametrización:

  • Parametrice todos los valores literales en la cláusula ON <merge_search_condition> y en la WHEN cláusulas de la declaración MERGE. Por ejemplo, puede incorporar la declaración MERGE en un procedimiento almacenado reemplazando los valores literales con los parámetros de entrada apropiados.
  • Si no puede parametrizar la declaración, cree una guía de plan de tipo TEMPLATE y especifique la PARAMETERIZATION FORCED sugerencia de consulta en la guía del plan.
  • Si las declaraciones MERGE se ejecutan con frecuencia en la base de datos, considere configurar la opción PARAMETERIZATION en el base de datos a FORZADO. Tenga cuidado al configurar esta opción. La opción PARAMETERIZATION es una configuración de nivel de base de datos y afecta cómo se procesan todas las consultas en la base de datos.

Mejores prácticas de la cláusula TOP

En la declaración MERGE, la cláusula TOP especifica el número o porcentaje de filas que se ven afectadas después de que se unen la tabla de origen y la tabla de destino, y después de que se eliminan las filas que no califican para una acción de inserción, actualización o eliminación . La cláusula TOP reduce aún más el número de filas unidas al valor especificado y las acciones de inserción, actualización o eliminación se aplican a las filas unidas restantes de forma desordenada. Es decir, no existe un orden en el que las filas se distribuyan entre las acciones definidas en las cláusulas WHEN. Por ejemplo, especificar TOP (10) afecta a 10 filas; de estas filas, 7 pueden actualizarse y 3 insertarse, o 1 puede eliminarse, 5 actualizarse 4 insertadas, etc.

Es común utilizar la cláusula TOP para realizar el lenguaje de manipulación de datos (DML ) operaciones en una mesa grande en lotes. Al usar la cláusula TOP en la declaración MERGE para este propósito, es importante comprender las siguientes implicaciones.

  • El rendimiento de E / S puede verse afectado.

    La instrucción MERGE realiza un escaneo completo de la tabla de origen y destino. La división de la operación en lotes reduce el número de operaciones de escritura realizadas por lote; sin embargo, cada lote realizará una exploración completa de la tabla de origen y destino. La actividad de lectura resultante puede afectar el rendimiento de la consulta.

  • Pueden producirse resultados incorrectos.

    Es importante asegurarse de que todos los lotes sucesivos apunten a nuevas filas o se puede producir un comportamiento no deseado, como la inserción incorrecta de filas duplicadas en la tabla de destino. Esto puede suceder cuando la tabla de origen incluye una fila que no estaba en un lote de destino, pero sí en la tabla de destino general.

  • Para asegurar resultados correctos:

    • Use la cláusula ON para determinar qué filas de origen afectan las filas de destino existentes y cuáles son genuinamente nuevas.
    • Use una condición adicional en la cláusula WHEN MATCHED para determinar si la fila de destino ya ha sido actualizada por un lote anterior.

Debido a que la cláusula TOP solo se aplica después de que se aplican estas cláusulas, cada ejecución inserta una fila genuinamente no coincidente o actualiza una fila existente.

Prácticas recomendadas para la carga masiva

La declaración MERGE se puede utilizar para cargar datos de forma masiva de manera eficiente desde un archivo de datos de origen a una tabla de destino especificando la cláusula OPENROWSET(BULK…) como fuente de la tabla. Al hacerlo, todo el archivo se procesa en un solo lote.

Para mejorar el rendimiento del proceso de fusión masiva, recomendamos las siguientes pautas:

  • Cree un índice agrupado en las columnas de unión en la tabla de destino.

  • Utilice las sugerencias ORDER y UNIQUE en la cláusula OPENROWSET(BULK…) para especificar cómo se ordena el archivo de datos de origen.

    De forma predeterminada, la operación masiva asume que el archivo de datos no está ordenado. Por lo tanto, es importante que los datos de origen se ordenen de acuerdo con el índice agrupado en la tabla de destino y que la sugerencia ORDER se use para indicar el orden para que el optimizador de consultas pueda generar un plan de consultas más eficiente. Las sugerencias se validan en tiempo de ejecución; si el flujo de datos no se ajusta a las sugerencias especificadas, se genera un error.

Estas pautas aseguran que las claves de combinación sean únicas y el orden de clasificación de los datos en el El archivo de origen coincide con la tabla de destino. El rendimiento de las consultas se mejora porque no son necesarias operaciones de clasificación adicionales y no se requieren copias de datos innecesarias.

Medición y diagnóstico del rendimiento de MERGE

Las siguientes funciones están disponibles para ayudarle a medir y diagnosticar el rendimiento de las declaraciones MERGE.

  • Utilice el contador stmt merge en la vista de administración dinámica sys.dm_exec_query_optimizer_info para devolver el número de optimizaciones de consulta que son para declaraciones MERGE.
  • Use el atributo merge_action_type en la vista de administración dinámica sys.dm_exec_plan_attributes para devolver el tipo de plan de ejecución del disparador utilizado como resultado de una declaración MERGE.
  • Use SQL Trace para recopilar datos de resolución de problemas para la declaración MERGE de la misma manera lo haría para otras declaraciones de lenguaje de manipulación de datos (DML). Para obtener más información, consulte Seguimiento de SQL.

Ejemplos

A. Uso de MERGE para realizar operaciones INSERT y UPDATE en una tabla en una sola instrucción

Un escenario común es actualizar una o más columnas en una tabla si existe una fila coincidente. O bien, insertando los datos como una nueva fila si no existe una fila coincidente. Por lo general, realiza cualquiera de los escenarios pasando parámetros a un procedimiento almacenado que contiene las instrucciones UPDATE e INSERT adecuadas. Con la instrucción MERGE, puede realizar ambas tareas en una sola instrucción. El siguiente ejemplo muestra un procedimiento almacenado en la base de datos AdventureWorks2012 que contiene una instrucción INSERT y una instrucción UPDATE. Luego, el procedimiento se modifica para ejecutar las operaciones equivalentes mediante una única instrucción MERGE.

B . Usando MERGE para realizar operaciones UPDATE y DELETE en una tabla en una sola declaración

El siguiente ejemplo usa MERGE para actualizar la tabla ProductInventory en la base de datos de muestra AdventureWorks2012, diariamente, según los pedidos que se procesan en la SalesOrderDetail tabla. La Quantity de la ProductInventory se actualiza restando el número de pedidos realizados cada día para cada producto en el SalesOrderDetail tabla. Si el número de pedidos de un producto reduce el nivel de inventario de un producto a 0 o menos, la fila de ese producto se elimina de la tabla ProductInventory.

C. Uso de MERGE para realizar operaciones UPDATE e INSERT en una tabla de destino mediante el uso de una tabla de origen derivada

El siguiente ejemplo usa MERGE para modificar la tabla SalesReason en la base de datos AdventureWorks2012 ya sea actualizando o insertando filas. Cuando el valor de NewName en la tabla de origen coincide con un valor en la columna Name de la tabla de destino, (SalesReason), la columna ReasonType se actualiza en la tabla de destino. Cuando el valor de NewName no coincide, la fila de origen se inserta en la tabla de destino. La tabla de origen es una tabla derivada que utiliza el constructor de valores de tabla Transact-SQL para especificar múltiples filas para la tabla de origen. Para obtener más información sobre el uso del constructor de valor de tabla en una tabla derivada, consulte Constructor de valor de tabla (Transact-SQL). El ejemplo también muestra cómo almacenar los resultados de la cláusula OUTPUT en una variable de tabla. Y, luego, resume los resultados de la instrucción MERGE ejecutando una operación de selección simple que devuelve el recuento de filas insertadas y actualizadas.

D.Insertar los resultados de la instrucción MERGE en otra tabla

El siguiente ejemplo captura los datos devueltos por la cláusula OUTPUT de una instrucción MERGE e inserta esos datos en otra tabla. La declaración MERGE actualiza la columna Quantity de la tabla ProductInventory en la base de datos AdventureWorks2012, según los pedidos que se procesan en la SalesOrderDetail tabla. El ejemplo captura las filas actualizadas y las inserta en otra tabla que se usa para realizar un seguimiento de los cambios en el inventario.

E. Usando MERGE para hacer INSERT o UPDATE en una tabla de borde de destino en una base de datos de gráficos

En este ejemplo, crea tablas de nodo Person y City y un tabla de borde livesIn. Utiliza la instrucción MERGE en el borde livesIn e inserta una nueva fila si el borde no existe ya entre un Person y City. Si el borde ya existe, simplemente actualice el atributo StreetAddress en el livesIn borde.

Consulte también

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *