MERGE kombinuje logiku INSERT, UPDATE a DELETE do jednoho příkazu DML, a proto je atomický. Pokud děláte jednořadé UPSERTS, pak jsou výhody méně zřejmé. Například naivní implementace UPSERT může vypadat takto:
IF EXISTS (SELECT * FROM t1 where [email protected])
UPDATE t1 SET ... WHERE [email protected]
ELSE
INSERT INTO t1 (...) VALUES (...)
Nicméně, aniž bychom to zabalili do transakce, je možné, že řádek, který budeme aktualizovat, bude smazán mezi SELECT a UPDATE. Přidání minimální logiky k vyřešení tohoto problému nám dává toto:
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
Tato logika není u příkazu MERGE nutná.
Mezi příkazem CURSORS a příkazem MERGE nejsou žádná srovnání, která by měla být provedena.