Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Quels sont les avantages de MERGE par rapport au simple IF EXISTS ?

MERGE combine les logiques INSERT, UPDATE et DELETE en une seule instruction DML, et est donc atomique. Si vous faites des UPSERTS à une seule rangée, les avantages sont moins évidents. Par exemple, une implémentation naïve d'un UPSERT peut ressembler à ceci :

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

Cependant, sans encapsuler cela dans une transaction, il est possible que la ligne que nous allons mettre à jour soit supprimée entre le SELECT et le UPDATE. L'ajout d'un minimum de logique pour résoudre ce problème nous donne ceci :

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

Cette logique n'est pas nécessaire avec l'instruction MERGE.

Aucune comparaison ne doit être établie entre CURSORS et l'instruction MERGE.