Condividi tramite


SELECT @local_variable (Transact-SQL)

Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure endpoint di analisi SQL di Azure Synapse Analytics in Microsoft Fabric Warehouse in Microsoft Fabric

Imposta una variabile locale sul valore di un'espressione.

Per l'assegnazione delle variabili è consigliabile usare SET @local_variable anziché SELECT @local_variable.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

SELECT { @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression }
    [ ,...n ] [ ; ]

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere Documentazione delle versioni precedenti.

Argomenti

@local_variable

Variabile dichiarata a cui deve essere assegnato un valore.

{ =|=^= | | | &=%= | /= | | | *= | +=-=}
Assegna il valore a destra alla variabile a sinistra.

Operatore di assegnazione composto:

Operatore Azione
= Assegna l'espressione seguente alla variabile
+= Aggiunta e assegnazione
-= Sottrazione e assegnazione
*= Moltiplicazione e assegnazione
/= Divisione e assegnazione
%= Modulo e assegnazione
&= AND bit per bit e assegnazione
^= XOR bit per bit e assegnazione
|= OR bit per bit e assegnazione

expression

Qualsiasi espressione valida. Include una sottoquery scalare.

Osservazioni:

L'istruzione SELECT @local_variable viene in genere usata per restituire un valore singolo nella variabile. Se tuttavia expression corrisponde al nome di una colonna, è possibile che restituisca più valori. Se l'istruzione SELECT restituisce più valori, alla variabile viene assegnato l'ultimo valore restituito.

Se l'istruzione SELECT non restituisce righe, la variabile mantiene il valore corrente. Se expression è una sottoquery scalare che non restituisce valori, la variabile viene impostata su NULL.

Un'istruzione SELECT può inizializzare più variabili locali.

Nota

Un'istruzione SELECT che include l'assegnazione di un valore a una variabile non può essere utilizzata anche per eseguire normali operazioni di recupero del set di risultati.

Esempi

R. Usare SELECT @local_variable per restituire un valore singolo

Nell'esempio seguente alla variabile @var1 viene assegnato "Generic Name" come valore. La query eseguita nella tabella Store non restituisce righe perché il valore specificato per CustomerID non esiste nella tabella. La variabile mantiene il valore "Generic Name".

In questo esempio viene usato il AdventureWorksLT database di esempio. Per altre informazioni, vedere Database di esempio AdventureWorks. Il AdventureWorksLT database viene usato come database di esempio per database SQL di Azure.

-- Uses AdventureWorks2022LT
DECLARE @var1 VARCHAR(30);
SELECT @var1 = 'Generic Name';

SELECT @var1 = [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000; --Value does not exist
SELECT @var1 AS 'ProductName';

Questo è il set di risultati.

ProductName
------------------------------
Generic Name

B. Usare SELECT @local_variable per restituire Null

Nell'esempio seguente viene utilizzata una sottoquery per assegnare un valore a @var1. Poiché il valore richiesto per CustomerID non esiste, la sottoquery non restituisce valori e la variabile viene impostata su NULL.

In questo esempio viene usato il AdventureWorksLT database di esempio. Per altre informazioni, vedere Database di esempio AdventureWorks. Il AdventureWorksLT database viene usato come database di esempio per database SQL di Azure.

-- Uses AdventureWorksLT
DECLARE @var1 VARCHAR(30);
SELECT @var1 = 'Generic Name';

SELECT @var1 = (SELECT [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000); --Value does not exist

SELECT @var1 AS 'Company Name';

Questo è il set di risultati.

Company Name
----------------------------
NULL

C. Uso antipattern dell'assegnazione di variabili ricorsive

Evitare lo schema seguente per l'uso ricorsivo di variabili ed espressioni:

SELECT @Var = <expression containing @Var>
FROM
...

In questo caso, non è garantito che @Var venga aggiornato riga per riga. Ad esempio, @Var può essere impostato sul valore iniziale di @Var per tutte le righe. Il motivo è che l'ordine e la frequenza in cui vengono elaborate le assegnazioni non è determinante. Questo si applica alle espressioni che contengono una concatenazione di stringhe di variabili, come illustrato di seguito, ma anche alle espressioni con variabili non stringa oppure operatori in stile +=. Preferire l'uso di funzioni di aggregazione per un'operazione basata su set anziché un'operazione riga per riga.

Per la concatenazione di stringhe considerare invece la funzione STRING_AGG, introdotta in SQL Server 2017 (14.x), per gli scenari in cui si desidera la concatenazione ordinata di stringhe. Per altre informazioni, vedere STRING_AGG (Transact-SQL).

Gli esempi di codice Transact-SQL in questo articolo usano il AdventureWorks2022 database di esempio o AdventureWorksDW2022 , che è possibile scaricare dalla home page degli esempi di Microsoft SQL Server e dei progetti della community.

Un esempio da evitare, in cui l'uso di ORDER BY nel tentativo di ordinare la concatenazione si traduce in un elenco incompleto:

DECLARE @List AS nvarchar(max);
SELECT @List = CONCAT(COALESCE(@List + ', ',''), p.LastName)
  FROM Person.Person AS p
  WHERE p.FirstName = 'William'
  ORDER BY p.BusinessEntityID;
SELECT @List;

Set di risultati:

(No column name)
---
Walker

Considerare invece:

DECLARE @List AS nvarchar(max);
SELECT @List = STRING_AGG(p.LastName,', ') WITHIN GROUP (ORDER BY p.BusinessEntityID)
  FROM Person.Person AS p
  WHERE p.FirstName = 'William';
SELECT @List;

Set di risultati:

(No column name)
---
Vong, Conner, Hapke, Monroe, Richter, Sotelo, Vong, Ngoh, White, Harris, Martin, Thompson, Martinez, Robinson, Clark, Rodriguez, Smith, Johnson, Williams, Jones, Brown, Davis, Miller, Moore, Taylor, Anderson, Thomas, Lewis, Lee, Walker

Vedi anche

Passaggi successivi