SET contro SELECT quando si assegnano le variabili?

Quali sono le differenze tra le istruzioni SET e SELECT durante l’assegnazione di variabili in T-SQL?

Citazione , che riassume da questo articolo :

  1. SET è lo standard ANSI per l’assegnazione di variabili, SELECT no.
  2. SET può solo assegnare una variabile alla volta, SELECT può eseguire più assegnazioni contemporaneamente.
  3. Se si assegna da una query, SET può solo assegnare un valore scalare. Se la query restituisce più valori / righe, allora SET genererà un errore. SELECT assegna uno dei valori alla variabile e nasconde il fatto che sono stati restituiti più valori (quindi probabilmente non sapresti mai perché qualcosa andasse storto altrove – divertiti a risolverlo)
  4. Quando si assegna da una query se non è stato restituito alcun valore, SET assegnerà NULL, dove SELECT non eseguirà affatto l’assegnazione (quindi la variabile non verrà modificata rispetto al suo valore precedente)
  5. Per quanto riguarda le differenze di velocità, non ci sono differenze dirette tra SET e SELECT. Tuttavia, la capacità di SELEZIONA di eseguire più compiti in un colpo gli conferisce un leggero vantaggio di velocità rispetto a SET.

Credo che SET sia standard ANSI mentre SELECT non lo è. Si noti inoltre il diverso comportamento di SET rispetto a SELECT nell’esempio qui sotto quando non si trova un valore.

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

Quando si scrivono query, è necessario tenere presente questa differenza:

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