MERGE kombiniert die INSERT-, UPDATE- und DELETE-Logik in einer DML-Anweisung und ist daher atomar. Bei einreihigen UPSERTS sind die Vorteile weniger offensichtlich. Beispielsweise kann eine naive Implementierung eines UPSERT wie folgt aussehen:
IF EXISTS (SELECT * FROM t1 where [email protected])
UPDATE t1 SET ... WHERE [email protected]
ELSE
INSERT INTO t1 (...) VALUES (...)
Ohne dies jedoch in eine Transaktion einzubinden, ist es möglich, dass die Zeile, die wir aktualisieren werden, zwischen dem SELECT und dem UPDATE gelöscht wird. Das Hinzufügen einer minimalen Logik, um dieses Problem zu beheben, ergibt Folgendes:
BEGIN TRAN
IF EXISTS (SELECT * FROM t1 WITH (HOLDLOCK, UPDLOCK) where [email protected] )
UPDATE t1 SET ... WHERE [email protected]
ELSE
INSERT INTO t1 (...) VALUES (...)
COMMIT
Diese Logik ist bei der MERGE-Anweisung nicht erforderlich.
Es gibt keine Vergleiche, die zwischen CURSORS und der MERGE-Anweisung gezogen werden sollten.