Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL-analysslutpunkt i Microsoft Fabric
Lager i Microsoft Fabric
SQL-databas i Förhandsversion av Microsoft Fabric
Anger en lokal variabel till värdet för ett uttryck.
För att tilldela variabler rekommenderar vi att du använder SET @local_variable i stället för SELECT @local_variable.
Transact-SQL syntaxkonventioner
Syntax
SELECT { @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression }
[ ,...n ] [ ; ]
Arguments
@ local_variable
En deklarerad variabel som ett värde ska tilldelas till.
{ =|=^= | | | &=%= | /= | | | *= | +=-=}
Tilldela värdet till höger till variabeln till vänster.
Sammansatt tilldelningsoperator:
| Operator | Action |
|---|---|
| = | Tilldelar uttrycket som följer till variabeln. |
| += | Lägga till och tilldela |
| -= | Subtrahera och tilldela |
| *= | Multiplicera och tilldela |
| /= | Dela upp och tilldela |
| %= | Modulo och tilldelning |
| &= | Bitvis OCH och tilldela |
| ^= | Bitvis XOR och tilldela |
| |= | Bitvis ELLER och tilldela |
expression
Valfritt giltigt uttryck. Detta inkluderar en skalär underfråga.
Remarks
SELECT @local_variable används vanligtvis för att returnera ett enda värde i variabeln. Men när uttrycket är namnet på en kolumn kan det returnera flera värden. Om SELECT-instruktionen returnerar mer än ett värde tilldelas variabeln det sista värdet som returneras.
Om SELECT-instruktionen inte returnerar några rader behåller variabeln sitt nuvärde. Om uttrycket är en skalär underfråga som inte returnerar något värde anges variabeln till NULL.
En SELECT-instruktion kan initiera flera lokala variabler.
Note
En SELECT-instruktion som innehåller en variabeltilldelning kan inte användas för att även utföra vanliga hämtningsåtgärder för resultatuppsättningar.
Examples
A. Använd SELECT @local_variable för att returnera ett enda värde
I följande exempel tilldelas variabeln @var1 "Allmänt namn" som dess värde. Frågan mot Store tabellen returnerar inga rader eftersom det angivna CustomerID värdet inte finns i tabellen. Variabeln behåller värdet "Allmänt namn".
I det här exemplet används exempeldatabasen AdventureWorksLT . Mer information finns i AdventureWorks-exempeldatabaser. Databasen AdventureWorksLT används som exempeldatabas för Azure SQL Database.
-- 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';
Här är resultatet.
ProductName
------------------------------
Generic Name
B. Använd SELECT @local_variable för att returnera null
I följande exempel används en underfråga för att tilldela ett värde till @var1. Eftersom det begärda CustomerID värdet inte finns returnerar underfrågan inget värde och variabeln är inställd på NULL.
I det här exemplet används exempeldatabasen AdventureWorksLT . Mer information finns i AdventureWorks-exempeldatabaser. Databasen AdventureWorksLT används som exempeldatabas för Azure SQL Database.
-- 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';
Här är resultatet.
Company Name
----------------------------
NULL
C. Antipatternanvändning av rekursiv variabeltilldelning
Undvik följande mönster för rekursiv användning av variabler och uttryck:
SELECT @Var = <expression containing @Var>
FROM
...
I det här fallet är det inte garanterat att det @Var uppdateras rad för rad. Kan till exempel @Var anges till det initiala värdet @Var för för alla rader. Det beror på att ordningen och frekvensen som tilldelningarna bearbetas i inte är obestämd. Detta gäller för uttryck som innehåller variabelsträngsammanfogning, vilket visas nedan, men även för uttryck med icke-strängvariabler eller +=-formatoperatorer. Använd aggregeringsfunktioner i stället för en uppsättningsbaserad åtgärd i stället för en rad-för-rad-åtgärd.
För strängsammanfogning bör du i stället överväga funktionen STRING_AGG , som introducerades i SQL Server 2017 (14.x), för scenarier där ordnad strängsammanfogning önskas. Mer information finns i STRING_AGG (Transact-SQL).
Kodexemplen i den här artikeln använder AdventureWorks2022- eller AdventureWorksDW2022-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.
Ett exempel att undvika, där användning av ORDER BY i försök att ordna sammanlänkning gör att listan är ofullständig:
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;
Result set:
(No column name)
---
Walker
Instead, consider:
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;
Result set:
(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
See also
- DECLARE @local_variable (Transact-SQL)
- Expressions (Transact-SQL)
- Sammansatta operatorer (Transact-SQL)
- SELECT (Transact-SQL)