MERGE łączy logikę INSERT, UPDATE i DELETE w jedną instrukcję DML i dlatego jest niepodzielna. Jeśli robisz UPSERTS jednorzędowe, korzyści są mniej oczywiste. Na przykład naiwna implementacja UPSERT może wyglądać następująco:
IF EXISTS (SELECT * FROM t1 where example@sqldat.com)
UPDATE t1 SET ... WHERE example@sqldat.com
ELSE
INSERT INTO t1 (...) VALUES (...)
Jednak bez pakowania tego w transakcję jest możliwe, że wiersz, który zamierzamy zaktualizować, zostanie usunięty między SELECT a UPDATE. Dodanie minimalnej logiki w celu rozwiązania tego problemu daje nam to:
BEGIN TRAN
IF EXISTS (SELECT * FROM t1 WITH (HOLDLOCK, UPDLOCK) where example@sqldat.com )
UPDATE t1 SET ... WHERE example@sqldat.com
ELSE
INSERT INTO t1 (...) VALUES (...)
COMMIT
Ta logika nie jest konieczna w przypadku instrukcji MERGE.
Nie ma porównań między CURSORS a instrukcją MERGE.