MERGE
беше въведен в SQL Server 2008. Ако искате да използвате този синтаксис, ще трябва да надстроите.
В противен случай типичният подход ще зависи от това откъде са изходните данни. Ако това е само един ред и не знаете дали трябва да актуализирате или вмъкнете, вероятно ще направите:
UPDATE ... WHERE key = @key;
IF @@ROWCOUNT = 0
BEGIN
INSERT ...
END
Ако вашият източник е #temp таблица, променлива на таблица, TVP или друга таблица, можете да направите:
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);
Както при MERGE
(и както Майкъл Суарт демонстрира тук
), все пак ще искате да заобиколите всеки от тези методи с подходящи транзакции, обработка на грешки и ниво на изолация, за да се държи като истинска, единична операция. Дори едно MERGE
не ви предпазва от едновременност.
Публикувах някои други предупреждения относно MERGE в повече подробности тук .