Quien no se ha topado con tener que hacer un UPDATE o INSERT según si existe o no el record en la tabla, es algo engorroso el tener que meter un IF para tomar esa decisión o inclusive tener que hacer un select para ver si el record existe o no y tomar la decisión.
Para este tipo de situaciones podemos usar la sentencia MERGE que nos proporciona MSSQL la cual se encarga de decidir que hacer ante esta situación, veamos un poco más sobre esta sentencia.
Creemos una tabla donde el CODE sea el KEY:
CREATE TABLE TestMerge
(Code NVARCHAR(10),
Description NVARCHAR(50),
);
GO
Ahora vamos a generar la sentencia MERGE para poder agregar o actualizar valores en esta tabla:
MERGE dbo.TestMerge AS T
USING (SELECT 'CODE1', 'Description CODE1') AS S (Code, Description)
ON (T.Code = S.Code)
WHEN MATCHED THEN
UPDATE SET Description = S.Description
WHEN NOT MATCHED THEN
INSERT (Code, Description)
VALUES (S.Code, S.Description);
Como podemos ver después de la palabra MERGE agregamos la tabla en la cual queremos agregar o actualizar la información, ésta será conocida como el TARGET (T)
MERGE dbo.TestMerge AS T
En la siguiente línea tenemos el USING en la cual declaramos de donde va a tomar la información que será enviada al TARGET, esta se conoce como el SOURCE (S)
USING (SELECT 'CODE1', 'Description CODE1') AS S (Code, Description)
En la línea del ON es donde vamos a filtrar la información y tomaremos la decisión de hacer un INSERT o un UPDATE, en este caso estamos filtrando en base al CODE.
ON (T.Code = S.Code)
Ahora vamos a ver el primer escenario, cuando el record existe en nuesta tabla
WHEN MATCHED THEN
UPDATE SET Description = S.Description
En este caso cuando existe hacemos un UPDATE a nuestr ainformación, acutalizamos el Description. Ahora validamos cuando el record no existe hacemos el INSERT, lo validamos de la siguiente forma:
WHEN NOT MATCHED THEN
INSERT (Code, Description) VALUES (S.Code, S.Description);
Ahora solo necesitamos ejecutar nuestro código para ver que es lo que sucede.
Caso 1.- La tabla no tiene ningún registro.
Al ejecutar el código este agregará un nuevo registro a la tabla
Como podemos ver el registro fue insertado correctamente en la tabla.
Caso 2.- Actualizar un registro existente
Ahora cambiaremos la Description del CODE1 a Description CHANGED
MERGE dbo.TestMerge AS T
USING (SELECT 'CODE1', 'Description CHANGED') AS S (Code, Description)
ON (T.Code = S.Code)
WHEN MATCHED THEN
UPDATE SET Description = S.Description
WHEN NOT MATCHED THEN
INSERT (Code, Description)
VALUES (S.Code, S.Description);
Como Podemos ver el Description fue cambiado por el nuevo valor.
Usar el MERGE que nos proporciona MSSQL es una gran ayuda, solo es necesario poner atención de los valores que usaremos para hacer el filtro y tomar la decisión de hacer el INSERT o el UPDATE.