El comando MERGE
en SQL Server permite realizar operaciones de inserción, actualización o eliminación en una tabla de destino en función de los datos de una tabla de origen. Es especialmente útil para sincronizar datos en procesos ETL o de mantenimiento de bases de datos.
MERGE
combina la lógica de INSERT
, UPDATE
y DELETE
en una sola sentencia, comparando registros entre una tabla de origen y una tabla de destino mediante una condición de coincidencia (ON
). Según el resultado de esta comparación, ejecuta acciones específicas.
MERGE INTO <tabla_destino> AS destino
USING <tabla_origen> AS origen
ON <condición_de_unión>
WHEN MATCHED THEN
<acción_si_coinciden>
WHEN NOT MATCHED [BY TARGET] THEN
<acción_si_faltan_en_destino>
WHEN NOT MATCHED BY SOURCE THEN
<acción_si_faltan_en_origen>
[OUTPUT <cláusula_output>];
Elemento | Descripción |
---|---|
tabla_destino
|
Tabla donde se aplicarán las operaciones (inserción, actualización o eliminación). |
tabla_origen
|
Conjunto de datos que se compara contra la tabla de destino. |
WHEN MATCHED
|
Acción a realizar si un registro en origen coincide con uno en destino .
|
WHEN NOT MATCHED
|
Acción a realizar si un registro en origen no tiene coincidencia en destino .
|
WHEN NOT MATCHED BY SOURCE
|
Acción a realizar si un registro en destino no tiene coincidencia en origen .
|
MERGE INTO productos AS destino
USING (SELECT id, nombre, precio FROM productos_nuevos) AS origen
ON destino.id = origen.id
WHEN MATCHED THEN
UPDATE SET destino.nombre = origen.nombre, destino.precio = origen.precio
WHEN NOT MATCHED THEN
INSERT (id, nombre, precio) VALUES (origen.id, origen.nombre, origen.precio);
En este caso:
destino
, se inserta.
MERGE INTO productos AS destino
USING (SELECT id FROM productos_actualizados) AS origen
ON destino.id = origen.id
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
Este comando elimina registros en la tabla de destino que no están presentes en la tabla de origen.
MERGE INTO productos AS destino
USING (SELECT id, nombre, precio FROM productos_nuevos) AS origen
ON destino.id = origen.id
WHEN MATCHED THEN
UPDATE SET destino.nombre = origen.nombre, destino.precio = origen.precio
WHEN NOT MATCHED THEN
INSERT (id, nombre, precio) VALUES (origen.id, origen.nombre, origen.precio)
OUTPUT $action, inserted.*, deleted.*;
El uso de OUTPUT
permite registrar las operaciones realizadas (INSERT
, UPDATE
, DELETE
) junto con los datos afectados.
1. Prueba con transacciones: Usa transacciones para evitar cambios no deseados en los datos.
2. Evita condiciones ambiguas: Asegúrate de que la condición en ON
sea específica y no genere múltiples coincidencias.
3. Controla los conflictos: Usa la cláusula WHEN MATCHED AND
para limitar qué registros se deben actualizar.
Consulta la documentación oficial de SQL Server sobre MERGE para obtener más información.
Jorge García
Fullstack developer