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 SQL database 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 ] [ ; ]
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';
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 Transact-SQL in questo articolo utilizzano il database campione AdventureWorks2022
o AdventureWorksDW2022
, che è possibile scaricare dalla home page di Esempi di Microsoft SQL Server e progetti collettivi.
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
- DECLARE @local_variable (Transact-SQL)
- Espressioni (Transact-SQL)
- Operatori composti (Transact-SQL)
- SELECT (Transact-SQL)