Usando Merge con Select

Usando Merge con una consulta como origen

La instrucción Merge realiza instrucciones de inserción de registros, actualización o eliminación de registros en una tabla de destino en la misma base de datos o en otra base de datos según los resultados de combinar los registros con una tabla de origen, esta tabla origen puede ser una consulta Select.

Merge puede ser usado de varias formas, en este ejercicio se va a usar dentro de un procedimiento almacenado para la inserción o actualización de un empleado. El origen desde donde se actualizará la tabla es una consulta.

Sintaxis
La forma de usar Merge es la siguiente:

MERGE
[ TOP ( n ) [ PERCENT ] ]
[ INTO ] [ [ AS ] AliasTablaDestino ]
USING [ [ As ] AliasTablaOrigen]
ON
[ WHEN MATCHED [ AND ]
THEN ] [ …n ]
[ WHEN NOT MATCHED [ BY TARGET ] [ AND ]
THEN ]
[ WHEN NOT MATCHED BY SOURCE [ AND ]
THEN ] [ …n ]

Donde
[ TOP ( n ) [ PERCENT ] ]
Permite especificar la cantidad en registros o porcentaje del total
que se tendrán en cuenta para las instrucciones dentro de Merge.
[ INTO ] [ [ AS ] AliasTablaDestino ]
Permite especificar la tabla donde se realizará la acción.
USING [ [ As ] AliasTablaOrigen]
Permite especificar la tabla o conjunto de resultados que servirán para realizar las instrucciones del Merge.
ON
Condición o condiciones que deben de cumplir los registros al compararlos entre las tablas origen y destino.
[ WHEN MATCHED [ AND ]
THEN ] [ …n ]

Instrucciones cuando se encuentra coincidencia en el destino.
[ WHEN NOT MATCHED [ BY TARGET ] [ AND ]
THEN ]
Instrucciones cuando no se encuentra coincidencia en el origen.
[ WHEN NOT MATCHED BY SOURCE [ AND ]
THEN ] [ …n ]

Instrucciones cuando no se encuentra coincidencia en el origen.

Para mayor información ver:

Merge en SQL Server
Procedimientos almacenados en SQL Server
Variables en SQL Server
Insertar registros
Actualización de registros
Output en Merge SQL Server

Usando la base de datos Northwind

use Northwind
go

Ejercicio

Procedimiento almacenado que evalúa la existencia de un Cliente, si el cliente existe se van a actualizar sus datos y si no existe se va a insertar un nuevo cliente.

Create or alter procedure spClientesActualizaInsertaMerge
(
@Codigo nchar(5),
@Nombre nvarchar(40),
@Contacto nvarchar(30),
@Cargo nvarchar(30),
@Direccion nvarchar(60),
@Ciudad nvarchar(15),
@Region nvarchar(15),
@CodigoPostal nvarchar(10),
@Pais nvarchar(15),
@Fono nvarchar(24),
@Fax nvarchar(24)
)
As
MERGE dbo.Customers As ClientesDestino
USING
(
SELECT @Codigo, @Nombre, @Contacto, @Cargo, @Direccion,
@Ciudad, @Region, @CodigoPostal, @Pais, @Fono, @Fax)
As ClientesOrigen
([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address], [City], [Region], [PostalCode], [Country], [Phone], [Fax])

ON ClientesDestino.CustomerId = ClientesOrigen.CustomerId
WHEN MATCHED then — Cliente encontrado
UPDATE
SET [CustomerID]=ClientesOrigen.[CustomerID],
[CompanyName]=ClientesOrigen.[CompanyName],
[ContactName]=ClientesOrigen.[ContactName],
[ContactTitle]=ClientesOrigen.[ContactTitle],
[Address]=ClientesOrigen.[Address],
[City]=ClientesOrigen.[City],
[Region]=ClientesOrigen.[Region],
[PostalCode]=ClientesOrigen.[PostalCode],
[Country]=ClientesOrigen.[Country],
[Phone]=ClientesOrigen.[Phone],
[Fax]=ClientesOrigen.[Fax]
WHEN NOT MATCHED THEN — Cliente no encontrado
INSERT VALUES
(@Codigo, @Nombre, @Contacto, @Cargo, @Direccion,
@Ciudad, @Region, @CodigoPostal, @Pais, @Fono, @Fax);
go

Listado de los clientes, se puede ver que el cliente con el que se va a ejecutar el SP no existe.
Select * from customers
go
El resultado se muestra en la siguiente imagen

Ejecutar el SP con un nuevo cliente.
Los datos del nuevo cliente son:
Codigo = ‘FLSND’
Nombre = ‘TRAINER SQL SERVER’
Contacto = ‘FERNANDO LUQUE SANCHEZ’
Cargo = ‘GERENTE GENERAL’
Direccion = ‘Av. San Blas 4995’
Ciudad = ‘Lima’
Region = ‘CE’
CodigoPostal = ‘11258’
Pais = ‘Perú’
Fono = ‘949483333’
Fax = ‘052-525258’

Ejecutando el procedimiento almacenado.
Execute spClientesActualizaInsertaMerge
@Codigo = ‘FLSND’,
@Nombre = ‘TRAINER SQL SERVER’,
@Contacto = ‘FERNANDO LUQUE SANCHEZ’,
@Cargo = ‘GERENTE GENERAL’,
@Direccion = ‘Av. San Blas 4995’,
@Ciudad = ‘Lima’,
@Region = ‘CE’,
@CodigoPostal = ‘11258’,
@Pais = ‘Perú’ ,
@Fono = ‘949483333’,
@Fax = ‘052-525258’
go
Listado de los clientes
select * from customers
go
El resultado se muestra en la siguiente imagen

Ejecutamos el SP con el mismo código del cliente pero con algunos datos cambiados.
Execute spClientesActualizaInsertaMerge
@Codigo = ‘FLSND’,
@Nombre = ‘Master SQL SERVER’,
@Contacto = ‘FERNANDO LUQUE SANCHEZ’,
@Cargo = ‘GERENTE GENERAL’,
@Direccion = ‘Av. Los Álamos 159’,
@Ciudad = ‘Trujillo’,
@Region = ‘CE’,
@CodigoPostal = ‘25852’,
@Pais = ‘Perú’ ,
@Fono = ‘95858582’,
@Fax = ‘052-525258’
go

Listado de los clientes
select * from customers
go
El resultado se muestra en la siguiente imagen
Note que se han actualizado el nombre del cliente, la dirección, la ciudad, el código postal y el teléfono.