Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
Database SQL di
AzureIstanza gestita di SQL di
AzureAzure Synapse Analytics
Endpoint di analisi SQL in Microsoft Fabric
Warehouse in Microsoft Fabric
Database SQL 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
Syntax
SELECT { @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression }
[ ,...n ] [ ; ]
Arguments
@ local_variable
Variabile dichiarata a cui deve essere assegnato 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 |
| &= | 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.
Remarks
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.
Note
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.
Examples
A. 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';
Il set di risultati è il seguente.
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';
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 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 in questo articolo usano il database di esempio AdventureWorks2025 o AdventureWorksDW2025, che è possibile scaricare dalla home page Microsoft SQL Server Samples and Community Projects.
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
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;
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
Vedere anche
- DECLARE @local_variable (Transact-SQL)
- Espressioni (Transact-SQL)
- Operatori composti (Transact-SQL)
- SELECT (Transact-SQL)