MERGE
introducerades i SQL Server 2008. Om du vill använda den syntaxen måste du uppgradera.
Annars kommer det typiska tillvägagångssättet att bero på varifrån källdata kommer. Om det bara är en rad och du inte vet om du behöver uppdatera eller infoga, skulle du förmodligen göra:
UPDATE ... WHERE key = @key;
IF @@ROWCOUNT = 0
BEGIN
INSERT ...
END
Om din källa är en #temp-tabell, tabellvariabel, TVP eller annan tabell kan du göra:
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);
Som med MERGE
(och som Michael Swart demonstrerade här
), kommer du fortfarande att vilja omge någon av dessa metoder med korrekta transaktioner, felhantering och isoleringsnivå för att bete sig som en sann, enda operation. Till och med en enda MERGE
uttalandet skyddar dig inte från samtidighet.
Jag har publicerat några andra varningar om MERGE in mer information här .