Dela via


SELECT @local_variable (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-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

Next steps