Question

J'essaie de réaliser le scénario classique d'insertion / mise à jour dans lequel je dois mettre à jour des lignes existantes dans une base de données ou les insérer si elles n'existent pas.

J'ai trouvé une question précédente sur le sujet , mais il traite des procédures stockées, que je n'utilise pas. J'aimerais simplement utiliser les instructions SQL SELECT, INSERT et UPDATE simples, à moins que quelque chose de mieux ne soit disponible (l'instruction MERGE n'est pas disponible dans SQL Server 2005).

Je suppose que mon idée générale est la suivante:

If the row is found
  update
else
  insert

En ce qui concerne la vérification de l’existence d’une ligne, combien coûte une instruction SELECT avant d’appeler un UPDATE ou un INSERT? Ou est-il préférable d'essayer simplement une mise à jour, de vérifier le nombre de lignes affectées, puis d'effectuer un INSERT si les lignes affectées sont égales à 0?

Était-ce utile?

La solution

La méthode la plus efficace consiste à exécuter le UPDATE , puis à effectuer un INSERT si @@ rowcount est égal à zéro, a expliqué dans cette réponse précédente .

Autres conseils

(Tout d’abord, je n’essaierais pas d’éviter les procédures stockées s’il n’existait pas de raison valable. Cela donnerait un bon avantage dans la plupart des cas.)

Vous pouvez le faire comme suit:

  • créer une table (temporaire)
  • remplissez vos lignes
  • exécuter un INTERSECT qui identifie les lignes existantes
  • mettez à jour votre table avec eux
  • exécuter un EXCEPT qui identifie les nouvelles lignes
  • lancer un insert avec ces éléments
  • déposer / effacer votre table (temporaire)

Cela fonctionnera probablement plus rapidement si vous insérez / mettez à jour un grand nombre de lignes.

Vous comprenez parfaitement que votre message s'intitule "SQL Server 2005". mais je voulais juste jeter quelque chose à attendre si / lorsque vous effectuez une mise à niveau vers SQL 2008. Microsoft a ajouté une nouvelle instruction MERGE qui vous donnera la possibilité de coder une instruction DML qui effectue à la fois la mise à jour et l’insertion. C'est vraiment cool. Je n'ai pas encore comparé les performances et les E / S, mais c'est tout simplement génial d'avoir un autre outil dans votre boîte à outils.

Si vous allez toujours à:
* Compter les rangs
* Insérer / Mettre à jour en fonction du résultat

Pourquoi pas à la place:
* Supprimer la ligne
* Insérer une ligne

Même résultat et plus net.
Autant que je sache lorsque vous mettez à jour une ligne - SQLServer effectue quand même une suppression / insertion (où elle existe)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top