MERGE
se introdujo en SQL Server 2008. Si desea utilizar esa sintaxis, deberá actualizar.
De lo contrario, el enfoque típico dependerá de dónde provengan los datos de origen. Si es solo una fila y no sabe si necesita actualizar o insertar, probablemente haría lo siguiente:
UPDATE ... WHERE key = @key;
IF @@ROWCOUNT = 0
BEGIN
INSERT ...
END
Si su fuente es una tabla #temp, variable de tabla, TVP u otra tabla, puede hacer lo siguiente:
UPDATE dest SET ...
FROM dbo.destination AS dest
INNER JOIN dbo.source AS src
ON dest.key = src.key;
INSERT dbo.destination SELECT ... FROM dbo.source AS src
WHERE NOT EXISTS (SELECT 1 FROM dbo.destination WHERE key = src.key);
Al igual que con MERGE
(y como Michael Swart demostró aquí
), aún querrá rodear cualquiera de estos métodos con transacciones adecuadas, manejo de errores y nivel de aislamiento para que se comporte como una sola operación real. Incluso un solo MERGE
declaración no lo protege de la concurrencia.
He publicado algunas otras precauciones sobre MERGE en más detalles aquí .