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 [email protected])
UPDATE t1 SET ... WHERE [email protected]
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 [email protected] )
UPDATE t1 SET ... WHERE [email protected]
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.