MERGE
wurde in SQL Server 2008 eingeführt. Wenn Sie diese Syntax verwenden möchten, müssen Sie aktualisieren.
Andernfalls hängt der typische Ansatz davon ab, woher die Quelldaten stammen. Wenn es nur eine Zeile ist und Sie nicht wissen, ob Sie aktualisieren oder einfügen müssen, würden Sie wahrscheinlich Folgendes tun:
UPDATE ... WHERE key = @key;
IF @@ROWCOUNT = 0
BEGIN
INSERT ...
END
Wenn Ihre Quelle eine #temp-Tabelle, Tabellenvariable, TVP oder eine andere Tabelle ist, können Sie Folgendes tun:
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);
Wie bei MERGE
(und wie Michael Swart hier demonstriert
), sollten Sie dennoch jede dieser Methoden mit geeigneten Transaktionen, Fehlerbehandlung und Isolationsstufe umgeben, um sich wie ein echter Einzelvorgang zu verhalten. Sogar ein einzelnes MERGE
-Anweisung schützt Sie nicht vor Parallelität.
Ich habe einige andere Vorsichtshinweise zu MERGE in veröffentlicht mehr Details hier .