2010-10-15 2 views

Répondre

338

Quote, qui résume de this article:

  1. SET est la norme ANSI pour l'attribution variable SELECT n'est pas.
  2. SET ne peut affecter qu'une seule variable à la fois, SELECT peut effectuer plusieurs affectations à la fois.
  3. 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)
  4. 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)
  5. 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.
+3

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" –

+11

@AlexKuznetsov: La phrase après dit exactement cela. –

+1

@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". –

121

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' */ 
+4

+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 –

+4

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

+4

@Zack Vous avez complètement manqué le point de l'exemple. –

16

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*/ 
+0

très agréable, succinct – SimplyInk