SELECT @local_variable (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsEndpoint di analisi SQL in Microsoft FabricWarehouse in Microsoft FabricDatabase SQL in Microsoft Fabric

Imposta una variabile locale sul valore di un'espressione.

Per l'assegnazione di variabili, usare SET @local_variable anziché SELECT @local_variable.

Convenzioni relative alla sintassi Transact-SQL

Syntax

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

Arguments

@local_variable

Variabile dichiarata per cui si assegna un valore.

{ = | += | -= | *= | /= | %= | &= | ^= | |=}

Assegna il valore a destra alla variabile a sinistra.

Operatore di assegnazione composto:

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

expression

Qualsiasi espressione valida. Questo termine include una sottoquery scalare.

Remarks

Usare SELECT @local_variable per restituire un singolo valore nella variabile. Se tuttavia expression corrisponde al nome di una colonna, è possibile che restituisca più valori. Se l'istruzione SELECT restituisce più di un valore, la variabile ottiene l'ultimo valore restituito dalla query.

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

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

Note

Non è possibile usare un'istruzione SELECT che contiene un'assegnazione di variabile per eseguire anche operazioni tipiche di recupero dei set di risultati.

Examples

Gli esempi di codice in questo articolo usano il database di esempio AdventureWorks2025 o AdventureWorksDW2025, che è possibile scaricare dalla home page Microsoft SQL Server Samples and Community Projects.

Il AdventureWorksLT database viene usato come database di esempio per database SQL di Azure.

A. Usare SELECT @local_variable per restituire un valore singolo

Nell'esempio seguente la variabile @var1 ottiene il valore 'Generic Name'. 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".

DECLARE @var1 AS VARCHAR (30);

SELECT @var1 = 'Generic Name';

SELECT @var1 = [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000;

SELECT @var1 AS 'ProductName';

Il set di risultati è il seguente.

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

B. Usare SELECT @local_variable per restituire Null

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

DECLARE @var1 AS VARCHAR (30);

SELECT @var1 = 'Generic Name';

SELECT @var1 = (SELECT [Name]
                FROM SalesLT.Product
                WHERE ProductID = 1000000);

SELECT @var1 AS 'Company Name';

Il set di risultati è il seguente.

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 per riga per riga. Ad esempio, @Var potrebbe essere impostato sul valore iniziale di @Var per tutte le righe. Questo comportamento si verifica perché l'ordine e la frequenza in cui vengono elaborate le assegnazioni non è un tenant. Questa regola si applica alle espressioni contenenti la concatenazione di stringhe di variabili, come illustrato nell'esempio seguente, ma anche alle espressioni con variabili non stringa o += operatori di 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, prendere in considerazione la funzione STRING_AGG, introdotta in SQL Server 2017 (14.x), per gli scenari in cui è desiderata la concatenazione di stringhe ordinate. Per altre informazioni, vedere STRING_AGG.

Nell'esempio seguente viene illustrato un antipattern da evitare. Se si usa ORDER BY in un tentativo di ordinamento della concatenazione, l'elenco risulta 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;

Il set di risultati è il seguente.

(No column name)
---
Walker

Invece, considera:

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;

Il set di risultati è il seguente.

(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