MERGE
è stato introdotto in SQL Server 2008. Se desideri utilizzare tale sintassi, dovrai eseguire l'aggiornamento.
In caso contrario, l'approccio tipico dipenderà dalla provenienza dei dati di origine. Se è solo una riga e non sai se è necessario aggiornare o inserire, probabilmente lo faresti:
UPDATE ... WHERE key = @key;
IF @@ROWCOUNT = 0
BEGIN
INSERT ...
END
Se la tua fonte è una tabella #temp, una variabile di tabella, TVP o un'altra tabella, puoi fare:
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);
Come con MERGE
(e come Michael Swart ha dimostrato qui
), vorrai comunque circondare uno di questi metodi con transazioni, gestione degli errori e livello di isolamento adeguati per comportarsi come una vera, singola operazione. Anche un singolo MERGE
dichiarazione non ti protegge dalla concorrenza.
Ho pubblicato alcune altre avvertenze su MERGE in maggiori dettagli qui .