MERGE combineert INSERT-, UPDATE- en DELETE-logica in één DML-statement en is daarom atomair. Als je UPSERTS met een enkele rij doet, zijn de voordelen minder voor de hand liggend. Een naïeve implementatie van een UPSERT kan er bijvoorbeeld als volgt uitzien:
IF EXISTS (SELECT * FROM t1 where [email protected])
UPDATE t1 SET ... WHERE [email protected]
ELSE
INSERT INTO t1 (...) VALUES (...)
Zonder dit echter in een transactie te verpakken, is het mogelijk dat de rij die we gaan updaten tussen de SELECT en de UPDATE wordt verwijderd. Door minimale logica toe te voegen om dat probleem aan te pakken, krijgen we dit:
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
Deze logica is niet nodig met de MERGE-instructie.
Er zijn geen vergelijkingen tussen CURSORS en de MERGE-instructie.