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