Définir versus sélectionner lors de l'attribution des variables?

quelles sont les différences entre les énoncés SET et SELECT lors de l'attribution de variables en T-SQL?

249
demandé sur Nima Derakhshanjan 2010-10-15 23:17:01

3 réponses

citation , qui résume de cet article :

  1. est la norme de norme ANSI pour l'attribution de la variable, SÉLECTIONNEZ ne l'est pas.
  2. SET ne peut assigner qu'une variable à la fois, SELECT peut faire plusieurs assignations à la fois.
  3. si vous assignez à partir d'une requête, SET ne peut assigner qu'une valeur scalaire. Si la requête renvoie plusieurs valeurs / lignes, alors la valeur sera générer une erreur. SELECT assignera une des valeurs à la variable et masquera le fait que plusieurs valeurs ont été retournées (de sorte que vous ne sauriez probablement jamais pourquoi quelque chose allait mal ailleurs - avoir du plaisir à résoudre celui-ci)
  4. lors de la cession d'une requête s'il n'y a pas de valeur retournée, SET assignera NULL, où SELECT ne fera pas la cession du tout (de sorte que la variable ne sera pas modifiée par rapport à sa valeur précédente)
  5. en ce qui concerne la vitesse différences-il n'y a pas de différences directes entre SET et SELECT. Toutefois, la capacité de SELECT de faire plusieurs affectations en un tir lui donne un léger avantage de vitesse sur SET.
364
répondu OMG Ponies 2016-01-05 16:30:22

je crois que SET est la norme de L'ANSI alors que SELECT ne l'est pas. Notez également le comportement différent de SET vs SELECT dans l'exemple ci-dessous, lorsqu'une valeur n'est pas trouvée.

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' */
132
répondu Joe Stefanelli 2010-10-15 19:28:22

lors de la rédaction de requêtes, cette différence doit être gardée à 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*/
22
répondu GorkemHalulu 2015-09-03 06:35:33