Quali sono le differenze tra le istruzioni SET
e SELECT
durante l’assegnazione di variabili in T-SQL?
Citazione , che riassume da questo articolo :
- SET è lo standard ANSI per l’assegnazione di variabili, SELECT no.
- SET può solo assegnare una variabile alla volta, SELECT può eseguire più assegnazioni contemporaneamente.
- 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)
- 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)
- 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*/