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