SELECT @local_variable (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsSQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

Egy helyi változót egy kifejezés értékére állít be.

Változók hozzárendeléséhez használja ahelyettSELECT @local_variable, hogy SET @local_variable .

Transact-SQL szintaxis konvenciók

Syntax

SELECT { @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression }
    [ , ...n ] [ ; ]

Arguments

@local_variable

Deklarált változó, amelyhez értéket rendel hozzá.

{ = | += | -= | *= | /= | %= | &= | ^= | |=}

Rendelje hozzá a jobb oldali értéket a bal oldali változóhoz.

Összetett hozzárendelés operátora:

Operator Action
= A következő kifejezést rendeli hozzá a változóhoz.
+= Hozzáadás és hozzárendelés
-= Kivonás és hozzárendelés
*= Szorzás és hozzárendelés
/= Osztás és hozzárendelés
%= Modulo és hozzárendelés
&= Bitenkénti AND és hozzárendelés
^= Bitenkénti XOR és hozzárendelés
|= Bitenkénti OR és hozzárendelés

expression

Bármilyen érvényes kifejezés. Ez a kifejezés skaláris alqueryt is tartalmaz.

Remarks

Egyetlen SELECT @local_variable érték visszaadása a változóba. Ha azonban a kifejezés egy oszlop neve, több értéket is visszaadhat. Ha az SELECT utasítás egynél több értéket ad vissza, a változó a lekérdezés által visszaadott utolsó értéket kapja.

Ha az SELECT utasítás nem ad vissza sorokat, a változó megtartja az aktuális értékét. Ha a kifejezés olyan skaláris alquery, amely nem ad vissza értéket, a változó NULLértéke a következő.

Egy SELECT utasítás több helyi változót is inicializálhat.

Note

Nem használhat SELECT változó-hozzárendelést tartalmazó utasítást a tipikus eredményhalmaz-lekérési műveletek végrehajtásához.

Examples

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

Az AdventureWorksLT adatbázis az Azure SQL Database mintaadatbázisaként használatos.

A. Egyetlen érték visszaadása a SELECT @local_variable használatával

Az alábbi példában a változó @var1 lekéri az értéket 'Generic Name'. A tábla lekérdezése Store nem ad vissza sorokat, mert a megadott CustomerID érték nem létezik a táblában. A változó megtartja az "Általános név" értéket.

DECLARE @var1 AS VARCHAR (30);

SELECT @var1 = 'Generic Name';

SELECT @var1 = [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000;

SELECT @var1 AS 'ProductName';

Itt van az eredmények összessége.

ProductName
------------------------------
Generic Name

B. Null értéket ad vissza a SELECT @local_variable használatával

Az alábbi példában egy al lekérdezés egy értéket rendel hozzá @var1. Mivel a kért CustomerID érték nem létezik, az al lekérdezés nem ad vissza értéket, és a változó értéke 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';

Itt van az eredmények összessége.

Company Name
----------------------------
NULL

C. Rekurzív változó hozzárendelésének antipattern használata

Kerülje a következő mintát a változók és kifejezések rekurzív használatához:

SELECT @Var = <expression containing @Var>
FROM
...

Ebben az esetben nem garantált, hogy @Var sorról sorra frissül. Előfordulhat például, @Var hogy az összes sor kezdeti értékeként @Var van beállítva. Ez a viselkedés azért fordul elő, mert a hozzárendelések feldolgozásának sorrendje és gyakorisága nem meghatározó. Ez a szabály a változók sztringösszefűzését tartalmazó kifejezésekre vonatkozik, ahogyan az az alábbi példában is látható, de a nem sztringváltozókkal vagy += stílusműveletekkel rendelkező kifejezésekre is. Sorról sorra művelet helyett használjon aggregációs függvényeket egy halmazalapú művelethez.

Sztringösszefűzés esetén vegye figyelembe a STRING_AGG függvényt, amelyet a 2017-SQL Server (14.x) tartalmaz, olyan helyzetekben, ahol a rendezett sztringösszefűzést szeretné használni. További információ: STRING_AGG.

Az alábbi példában egy elkerülendő antipattern látható. Az összefűzési kísérlettel ORDER BY a lista hiányos:

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;

Itt van az eredmények összessége.

(No column name)
---
Walker

Ehelyett fontoljuk meg:

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;

Itt van az eredmények összessége.

(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