[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
)