MERGE kombinerar INSERT-, UPDATE- och DELETE-logik till en DML-sats och är därför atomär. Om du gör en rad UPSERTS är fördelarna mindre uppenbara. Till exempel kan en naiv implementering av en UPSERT se ut så här:
IF EXISTS (SELECT * FROM t1 where example@sqldat.com)
UPDATE t1 SET ... WHERE example@sqldat.com
ELSE
INSERT INTO t1 (...) VALUES (...)
Men utan att lägga in detta i en transaktion är det möjligt att raden vi ska uppdatera kommer att raderas mellan SELECT och UPPDATERING. Genom att lägga till minimal logik för att lösa problemet ger oss detta:
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
Denna logik är inte nödvändig med MERGE-satsen.
Det finns inga jämförelser mellan CURSORS och MERGE-satsen.