Esta cláusula sirve para ejecutar operaciones de inserción, actualización o eliminación en un solo paso, según los resultados de una combinación con una tabla de origen. Es más eficiente que hacer operaciones separadas.
MERGE Empleados_Datos AS T
USING (
SELECT 0 IdEmpleado, 'Pablo' Nombre , 'Pablo' [login]
UNION
SELECT -1 IdEmpleado, 'Ana' Nombre , 'Ana' [login]
UNION
SELECT -2 IdEmpleado, 'Jose' Nombre , 'Jose' [login]
) AS S
ON (T.IdEmpleado = S.IdEmpleado)
-- insertar si no existe en el destino
WHEN NOT MATCHED BY TARGET
THEN INSERT(IdEmpleado, Nombre) VALUES (S.IdEmpleado,S.Nombre)
-- modificar si existe en el destino
WHEN MATCHED
THEN UPDATE SET T.Nombre = S.Nombre
-- si no existe en el origen borrar
WHEN NOT MATCHED BY SOURCE
THEN DELETE
;
Editar el trigger Fianzas_Cli_DTrig para ver un ejemplo de MERGE y como sustituye a un cursor.
Ejemplo de cláusula MREGE combinada con cláusula OUTPUT:
BEGIN TRAN
Declare @Tab_Result TABLE (IdDoc int, IdDelegacion int, Nombre_Anterior varchar(1000), Nombre_Nuevo varchar(1000))
MERGE Delegaciones AS T
USING ( VALUES (900,'Delegacion_900'),(901,'Delegacion_901'),(902,'Delegacion_902'),(0,'DELEGACION_0')
) AS S (IdDelegacion,Nombre)
ON (T.IdDelegacion = S.IdDelegacion)
-- insertar si no existe en el destino
WHEN NOT MATCHED BY TARGET
THEN INSERT(IdDelegacion, Nombre) VALUES (S.IdDelegacion,S.Nombre)
-- modificar si existe en el destino
WHEN MATCHED
THEN UPDATE SET T.Nombre = S.Nombre
-- si no existe en el origen borrar
WHEN NOT MATCHED BY SOURCE AND T.IdDelegacion>=900
THEN DELETE
OUTPUT inserted.iddoc, deleted.IdDelegacion, deleted.nombre, S.Nombre INTO @Tab_Result
;
select * from @Tab_Result
select * from Delegaciones
ROLLBACK TRAN
Con esta consulta añadimos delegaciones y modificamos el nombre de la delegación 0 si existe. Además, también podemos ver en la tabla @Tab_Result, los datos eliminados y borrados y también datos del origen (source) utilizados para el MERGE.