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.

<< Artículo anterior                                                                                                                                       Siguiente artículo >>