quand utiliser SET vs SELECT pour assigner des valeurs à des variables dans SQL Server

par: Atif Shehzad | mise à jour: 2009-11-25 | commentaires (13) | connexes: Plus > T-SQL

problème

SET et SELECT peuvent être utilisés pour assigner des valeurs à par T-SQL. Les deux accomplissent la tâche, mais dans certains scénarios, des résultats inattendus peuvent être produits. Dans thistip, je développe les considérations pour choisir entre les méthodes SET et SELECTPOUR attribuer une valeur à la variable.,

Solution

dans la plupart des cas, SET et SELECT peuvent être utilisés alternativement sans aucun effet.

Voici quelques scénarios lorsque la prise en compte est requise pour choisir betweenSET ou SELECT. Les Scripts utilisant la base de données AdventureWorks sont fournis pour une clarification plus poussée.

Les Parties 1 et 2 sont mentionnées dans les scripts ci-dessous. Il serait préférable que vous exécutiez chaque partie du script séparément afin que vous puissiez voir les résultats pour chaque méthode.,

renvoyer des valeurs via une requête

chaque fois que vous attribuez une valeur renvoyée à une requête à une variable, SET acceptera et affectera une valeur scalaire (unique) à partir d’une requête. Alors que SELECT pourrait accepter des valeurs multiplereturned. Mais après avoir accepté plusieurs valeurs via une commande SELECT, vous n’avez aucun moyen de suivre la valeur présente dans la variable. La dernière valeur renvoyée dans la liste remplira la variable. En raison de cette situation, cela peut conduire à des résultats attendus, car aucune erreur ou avertissement ne serait généré si multiplevalues était renvoyé lors de L’utilisation de SELECT., Donc, si plusieurs valeurs peuvent être attenuesutilisez L’option SET avec la mise en œuvre appropriée des mécanismes de gestion des erreurs.

pour clarifier davantage le concept, exécutez le script # 1 en deux parties distinctes pour voir les résultats

La Partie 1 du script devrait réussir. La variable est remplie avec un singlevalue through SET. Mais dans la partie 2 du script, le message d’erreur suivant sera produit et L’instruction SET ne parviendra pas à remplir la variable lorsque plus d’une valeur sera renvoyée.

message D’erreur généré pour SET

par conséquent SET a empêché L’affectation d’une valeur ambiguë.,

en cas de SELECT, même si plusieurs valeurs sont renvoyées par la requête, aucune erreur ne sera générée et il n’y aura aucun moyen de suivre que plusieurs valeurs ont été retournées et quelle valeur est présente dans la variable. Ceci est démontré dans ce qui suivantscript.

Les parties 1 et 2 ont été exécutées avec succès. Dans la partie 2, plusieurs valeurs ont été attribuées et acceptées, sans savoir quelle valeur peuplerait réellement la variable., Ainsi, lorsque la récupération de plusieurs valeurs est attendue, considérez les différences comportementales entre SET et SELECT et implémentez une gestion des erreurs appropriée pour ces circonstances.

assigner plusieurs valeurs à plusieurs variables

Si vous devez remplir plusieurs variables, au lieu d’utiliser des statementseach SET séparés, envisagez D’utiliser SELECT pour remplir toutes les variables dans une seule instruction.Cela peut être utilisé pour remplir des variables directement ou en sélectionnant des valeurs dans la base de données.

considérez le script suivant comparant L’utilisation de SELECT et SET.,

Si vous utilisez SET, chaque variable devra recevoir des valeurs individuellement à travers plusieurs instructions, comme indiqué ci-dessous.

SELECT est évidemment plus efficace que SET lors de l’attribution de valeurs à multiplevariables en termes d’instructions exécutées, de code et d’octets réseau.

Que Faire si la variable n’est pas remplie avec succès

Si une variable n’est pas remplie avec succès, le comportement de SET et SELECTwould être différent. L’affectation a échoué peut être due à l’absence de résultat renvoyé ou à une valeur non compatible attribuée à la variable., Dans ce cas, SELECT conserverait la valeur previousvalue le cas échéant, où SET attribuerait NULL. En raison de la fonctionnalité de différence,les deux peuvent conduire à des résultats inattendus et doivent être considérés avec soin.

ceci est montré dans le script suivant

--Script # 5 - Behavior of SET and SELECT for missing valueUSE AdventureWorksGO -- Part 1. Observe behavior of missing result with SETDECLARE @var1 VARCHAR(20)SET @var1 = 'Value 1 Assigned'PRINT @var1SET @var1 = (SELECT Color FROM Production.Product WHERE ProductID = 32022)PRINT @var1GO -- Part 1. Observe behavior of missing result with SELECTDECLARE @var1 VARCHAR(20)SELECT @var1 = 'Value 1 Assigned'PRINT @var1 SELECT @var1 = Color FROM Production.Product WHERE ProductID = 32023PRINT @var1GO

Nous pouvons voir que la partie 1 génère NULL lorsqu’aucune valeur n’est renvoyée pour populatingvariable. Où en tant que partie 2 produit la valeur précédente qui est conservée après failedassignment de la variable. Cette situation peut conduire à des résultats inattendus et nécessiterconsidération.,

suivre les normes

L’utilisation de SELECT peut sembler un meilleur choix dans des scénarios spécifiques, mais sachez que L’utilisation de SELECT pour attribuer des valeurs à des variables n’est pas incluse dans les ANSIstandards. Si vous suivez les normes à des fins de migration de code, évitez D’utiliser SELECT et d’utiliser SET à la place.

Conclusion

la meilleure pratique suggère de ne pas s’en tenir à une méthode. Selon le scenarioyou peut vouloir utiliser à la fois SET ou SELECT.,

Voici quelques scénarios pour utiliser SET

  • Si vous devez affecter une seule valeur directement à la variable et que noquery est impliqué pour récupérer la valeur
  • NULL assignments are expected (NULL returned in result set)
  • Les normes sont censées être suivies pour toute migration planifiée
  • des résultats non scalaires sont attendus et doivent être gérés

L’utilisation de SELECT est efficace et flexible dans les cas suivants.,

  • plusieurs variables sont remplies en assignant des valeurs directement
  • plusieurs variables sont remplies par une seule source (table , vue)
  • moins de codage pour assigner plusieurs variables
  • utilisez ceci si vous avez besoin d’obtenir @@ROWCOUNT et @ERROR pour la dernière instruction exécutée
prochaines étapes
  • Cliquez ici pour améliorations SQL dans SQL Server 2008.,
  • Cliquez ici pour en savoir plus sur @@ROWCOUNT
  • Cliquez ici pour en savoir plus sur @@ERROR

dernière mise à jour: 2009-11-25

à propos de L’auteur
atif Shehzad est un DBA SQL Server passionné, réviseur technique et auteur d’articles.
voir tous mes conseils
Ressources connexes

  • Plus de conseils pour les développeurs de bases de données…

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *