MERGE
został wprowadzony w SQL Server 2008. Jeśli chcesz używać tej składni, musisz dokonać aktualizacji.
W przeciwnym razie typowe podejście będzie zależeć od tego, skąd pochodzą dane źródłowe. Jeśli to tylko jeden wiersz i nie wiesz, czy musisz zaktualizować, czy wstawić, prawdopodobnie zrobisz:
UPDATE ... WHERE key = @key;
IF @@ROWCOUNT = 0
BEGIN
INSERT ...
END
Jeśli źródłem jest tabela #temp, zmienna tabeli, TVP lub inna tabela, możesz wykonać:
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);
Podobnie jak w przypadku MERGE
(i jak Michael Swart zademonstrował tutaj
), nadal będziesz chciał otoczyć każdą z tych metod odpowiednimi transakcjami, obsługą błędów i poziomem izolacji, aby zachowywać się jak prawdziwa, pojedyncza operacja. Nawet pojedynczy MERGE
oświadczenie nie chroni przed współbieżnością.
Opublikowałem kilka innych ostrzeżeń dotyczących MERGE w więcej szczegółów tutaj .