[T-SQL] If Exists Update Else Insert

Ceci est une situation assez courante qui se présente lors de l'exécution opérations de base de données. Une procédure stockée est appelée et les données nécessaires à mettre à jour si elle existe déjà et insérée si elle n'existe pas.

Si nous reportez-vous à la documentation de la documentation en ligne, elle donne des exemples semblable à:

 

IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue')
    UPDATE Table1 SET (...) WHERE Column1='SomeValue'
ELSE
    INSERT INTO Table1 VALUES (...)

 

Cette approche fonctionne, mais ce n'est peut-être pas toujours la meilleure approche.

Cela fera une analyse de table / index à la fois pour l'instruction SELECT et le Instruction UPDATE. Dans la plupart des approches standard, la déclaration suivante fournira probablement une meilleure performance.

Il ne fera qu'un analyse de table / index au lieu des deux qui sont effectuées dans le précédent approche.

 

UPDATE Table1 SET (...) WHERE Column1='SomeValue'
IF @@ROWCOUNT=0
    INSERT INTO Table1 VALUES (...)

 

L'analyse de la table / index enregistrée peut augmenter considérablement les performances à mesure que le nombre de lignes dans la table ciblée augmente.

Rappelez-vous, les exemples dans la documentation MSDN sont généralement les moyens le plus simple de mettre en œuvre quelque chose, pas nécessairement le meilleur moyen. il est bon de tester les différentes approches que vous prenez.
Parfois, la méthode que vous pensez être la plus mauvaise pourrait en fait surpasser celle que vous pensez être la meilleure.

 

Pour SQL Server 2008 et versions ultérieures, Microsoft a introduit l'opération MERGE. MERGE tente à la fois d'exécuter une commande UPDATE et une commande INSERT. Cela synchronise efficacement les deux tables en fonction de la requête effectuée, en mettant à jour et en insérant les enregistrements nécessaires pour que les deux correspondent.

 

MERGE INTO
  table1
USING
  table2
ON
  table1.author_id = table2.id
WHEN MATCHED THEN
  UPDATE SET
    table1.author_name = table2.name
WHEN NOT MATCHED THEN
  INSERT
    (table1.author_id, table1.author_name)
  VALUES
    (table2.id, table2.name)