Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Quali sono i vantaggi di MERGE rispetto al semplice IF EXISTS?

MERGE combina la logica INSERT, UPDATE e DELETE in un'unica istruzione DML e quindi è atomica. Se stai facendo UPSERTS a riga singola, i vantaggi sono meno evidenti. Ad esempio, un'implementazione ingenua di un UPSERT potrebbe essere simile alla seguente:

IF  EXISTS (SELECT * FROM t1 where [email protected])
    UPDATE t1 SET ... WHERE [email protected]
ELSE
    INSERT INTO t1 (...) VALUES (...)

Tuttavia, senza avvolgerlo in una transazione, è possibile che la riga che aggiorneremo venga eliminata tra SELECT e UPDATE. Aggiungendo una logica minima per risolvere il problema, dacci questo:

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

Questa logica non è necessaria con l'istruzione MERGE.

Non ci sono confronti da fare tra CURSORS e l'istruzione MERGE.