Kommentar
Å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-analysendpoint i Microsoft Fabric
Lager i Microsoft Fabric
SQL-databas i Microsoft Fabric
Anger en lokal variabel till värdet för ett uttryck.
För att tilldela variabler använder du 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 du tilldelar ett värde för.
{ = | += | -= | *= | /= | %= | &= | ^= | |=}
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 AND och tilldela |
| ^= | Bitvis XOR och tilldela |
| |= | Bitvis OR och tilldela |
expression
Valfritt giltigt uttryck. Den här termen innehåller en skalär underfråga.
Remarks
Använd SELECT @local_variable för att returnera ett enda värde till variabeln. Men när uttrycket är namnet på en kolumn kan det returnera flera värden. Om -instruktionen SELECT returnerar mer än ett värde hämtar variabeln det sista värdet som frågan returnerar.
Om instruktionen SELECT inte returnerar några rader behåller variabeln sitt aktuella vä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
Du kan inte använda en SELECT instruktion som innehåller en variabeltilldelning för att även utföra vanliga hämtningsåtgärder för resultatuppsättningar.
Examples
Kodexemplen i den här artikeln använder AdventureWorks2025- eller AdventureWorksDW2025-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.
Databasen AdventureWorksLT används som exempeldatabas för Azure SQL Database.
A. Använd SELECT @local_variable för att returnera ett enda värde
I följande exempel hämtar variabeln @var1 värdet 'Generic Name'. 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".
DECLARE @var1 AS VARCHAR (30);
SELECT @var1 = 'Generic Name';
SELECT @var1 = [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000;
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 tilldelar en underfråga 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.
DECLARE @var1 AS VARCHAR (30);
SELECT @var1 = 'Generic Name';
SELECT @var1 = (SELECT [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000);
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 vara inställt på det initiala värdet @Var för för alla rader. Det här beteendet beror på att ordningen och frekvensen där tilldelningarna bearbetas inte är obestämd. Den här regeln gäller för uttryck som innehåller variabelsträngsammanfogning, vilket visas i följande exempel, 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 ö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.
I följande exempel visas ett antimönster att undvika. Om du använder ORDER BY i ett försök att ordna sammanlänkning blir listan 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;
Här är resultatet.
(No column name)
---
Walker
Överväg istället:
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;
Här är resultatet.
(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