Quelles sont les différences entre les instructions SET
et SELECT
lors de l'affectation de variables dans T-SQL?SET versus SELECT lors de l'attribution de variables?
Répondre
Quote, qui résume de this article:
- SET est la norme ANSI pour l'attribution variable SELECT n'est pas.
- SET ne peut affecter qu'une seule variable à la fois, SELECT peut effectuer plusieurs affectations à la fois.
- Si vous attribuez une requête, SET ne peut attribuer qu'une valeur scalaire. Si la requête renvoie plusieurs valeurs/lignes, SET déclenchera une erreur. SELECT affectera l'une des valeurs à la variable et cachera le fait que plusieurs valeurs ont été retournées (donc vous ne saurez probablement jamais pourquoi quelque chose n'allait pas ailleurs - amusez-vous à résoudre ce problème)
- Lors de l'affectation d'une requête s'il y a aucune valeur ne sera retournée alors SET assignera NULL, où SELECT ne fera pas l'affectation du tout (donc la variable ne sera pas modifiée de sa valeur précédente)
- En ce qui concerne les différences de vitesse - il n'y a pas de différences directes entre SET et SELECT . Cependant, la capacité de SELECT à effectuer plusieurs assignations en un coup lui donne un léger avantage de rapidité par rapport à SET.
Je crois SET
est la norme ANSI alors que le SELECT
n'est pas. Notez également le comportement différent de SET
par rapport à SELECT
dans l'exemple ci-dessous lorsqu'une valeur est introuvable.
declare @var varchar(20)
set @var = 'Joe'
set @var = (select name from master.sys.tables where name = 'qwerty')
select @var /* @var is now NULL */
set @var = 'Joe'
select @var = name from master.sys.tables where name = 'qwerty'
select @var /* @var is still equal to 'Joe' */
+1 Il est préférable de lancer une fois pour comprendre, vérifier, jouer, mémoriser cela pour lire, mais les autres réponses ne sont que du texte –
Si vous avez utilisé 'select @var = (sélectionnez le nom de master.sys.tables où name = 'qwerty') 'vous obtiendriez @var comme nul. L'exemple que vous donnez n'est pas la même requête. – Zack
@Zack Vous avez complètement manqué le point de l'exemple. –
Lors de l'écriture des requêtes, cette différence doit garder à l'esprit:
DECLARE @A INT = 2
SELECT @A = TBL.A
FROM (SELECT 1 A) TBL
WHERE 1 = 2
SELECT @A
/* @A is 2*/
---------------------------------------------------------------
DECLARE @A INT = 2
SET @A = (
SELECT TBL.A
FROM (SELECT 1 A) TBL
WHERE 1 = 2
)
SELECT @A
/* @A is null*/
très agréable, succinct – SimplyInk
Je n'ai pas downvote, mais ce qui suit est pas tout à fait correct: « En ce qui concerne les différences de vitesse - il n'y a pas de différences directes entre SET et SELECT ". Si vous affectez plusieurs valeurs dans un même slect, cela peut être beaucoup plus rapide qu'avec des ensembles de maulles. Google up "Affectation de plusieurs variables avec un SELECT fonctionne plus vite" –
@AlexKuznetsov: La phrase après dit exactement cela. –
@OMG Poneys: Il peut être 10 fois plus rapide ou plus, donc je ne suis pas sûr si c'est "léger avantage de vitesse". –