Antes y después del Merge – Upsert SQL Server (es-ES)
Hace poco tiempo un cliente me comentaba sobre la necesidad de ejecutar comandos de tipo UPSERT, típicamente este proceso lo venía haciendo de forma manual, hacia una revisión uno a uno de los campos y luego mediante estructuras en TSQL hacia la carga o la actualización a su base de datos, por eso me dispuse a escribir este post.
Desde la versión 2008 de Microsoft SQL Server, contamos con una nueva forma de actualizar o insertar datos a una tabla, este comando nos permite ir un paso más allá y en una sola transacción efectuar todo el proceso, de golpe y sin mayores complicaciones.
Antes del MERGE
CREATE PROC SINMERGE
@BK_CLIENTE INT,
@NUEVADIRECCION VARCHAR(100)
AS
BEGIN
SET NOCOUNT ON;
--ACTUALIZAR LA FILA DEL CLIENTE
UPDATE CLIENTE
SET DIRECCION = @NUEVADIRECCION
WHERE IDCLIENTE = @BK_CLIENTE
--VERIFICAR SI SE ACTUALIZO ALGUNA FILA
IF (@@ROWCOUNT = 0)
BEGIN
INSERT INTO CLIENTE (IDCLIENTE, DIRECCION)
VALUES (@BK_CLIENTE, @NUEVADIRECCION)
END
END
Después del MERGE
CREATE PROC CONMERGE
@BK_CLIENTE INT,
@NUEVADIRECCION VARCHAR(100)
AS
BEGIN
MERGE CLIENTE AS DESTINO
USING (SELECT @BK_CLIENTE, @NUEVADIRECCION) AS FUENTE (IDCLIENTE, DIRECCION)
ON (DESTINO.IDCLIENTE = FUENTE.IDCLIENTE)
WHEN MATCHED THEN
UPDATE SET DIRECCION = FUENTE.DIRECCION
WHEN NOT MATCHED THEN
INSERT (IDCLIENTE, DIRECCION)
VALUES (FUENTE.IDCLIENTE, FUENTE.DIRECCION)
END