WYBIERZ @local_variable (Transact-SQL)

Dotyczy do:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsEndpoint analityki SQL w Microsoft FabricMagazyn w Microsoft FabricBaza danych SQL w Microsoft Fabric

Ustawia zmienną lokalną na wartość wyrażenia.

Do przypisywania zmiennych należy użyć SET @local_variable zamiast SELECT @local_variable.

Transact-SQL konwencje składni

Syntax

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

Arguments

@local_variable

Zadeklarowana zmienna, dla której przypisujesz wartość.

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

Przypisz wartość po prawej stronie do zmiennej po lewej stronie.

Operator przypisania złożonego:

Operator Action
= Przypisuje wyrażenie, które następuje poniżej, do zmiennej.
+= Dodawanie i przypisywanie
-= Odejmij i przypisz
*= Mnożenie i przypisywanie
/= Dzielenie i przypisywanie
%= Modulo i przypisanie
&= Bitowe AND i przypisywane
^= Bitowe XOR i przypisywane
|= Bitowe OR i przypisywane

expression

Dowolne prawidłowe wyrażenie. Ten termin zawiera podzapytanie skalarne.

Remarks

Użyj polecenia SELECT @local_variable , aby zwrócić pojedynczą wartość do zmiennej. Jeśli jednak wyrażenie jest nazwą kolumny, może zwrócić wiele wartości. SELECT Jeśli instrukcja zwraca więcej niż jedną wartość, zmienna pobiera ostatnią wartość zwracaną przez zapytanie.

SELECT Jeśli instrukcja nie zwraca żadnych wierszy, zmienna zachowuje bieżącą wartość. Jeśli wyrażenie jest podzapytaniem skalarnym, które nie zwraca żadnej wartości, zmienna jest ustawiona na NULLwartość .

Jedna SELECT instrukcja może zainicjować wiele zmiennych lokalnych.

Note

Nie można użyć SELECT instrukcji zawierającej przypisanie zmiennej, aby również wykonywać typowe operacje pobierania zestawu wyników.

Examples

Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2025 lub AdventureWorksDW2025, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.

Baza AdventureWorksLT danych jest używana jako przykładowa baza danych dla usługi Azure SQL Database.

A. Użyj polecenia SELECT @local_variable , aby zwrócić pojedynczą wartość

W poniższym przykładzie zmienna @var1 pobiera wartość 'Generic Name'. Zapytanie względem Store tabeli nie zwraca żadnych wierszy, ponieważ określona wartość CustomerID nie istnieje w tabeli. Zmienna przechowuje wartość "Nazwa ogólna".

DECLARE @var1 AS VARCHAR (30);

SELECT @var1 = 'Generic Name';

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

SELECT @var1 AS 'ProductName';

Oto zestaw wyników.

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

B. Użyj polecenia SELECT @local_variable , aby zwrócić wartość null

W poniższym przykładzie podzapytywanie przypisuje wartość do @var1. Ponieważ wartość żądana dla CustomerID elementu nie istnieje, podzapytywanie nie zwraca żadnej wartości, a zmienna jest ustawiona na NULLwartość .

DECLARE @var1 AS VARCHAR (30);

SELECT @var1 = 'Generic Name';

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

SELECT @var1 AS 'Company Name';

Oto zestaw wyników.

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

C. Antywzorcowe używanie przypisania zmiennej cyklicznego

Unikaj następującego wzorca w przypadku cyklicznego używania zmiennych i wyrażeń:

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

W takim przypadku nie ma gwarancji, że @Var jest aktualizowany w wierszu według wierszy. Na przykład @Var można ustawić wartość początkową @Var dla wszystkich wierszy. To zachowanie występuje, ponieważ kolejność i częstotliwość przetwarzania przypisań jest nieokreślona. Ta reguła ma zastosowanie do wyrażeń zawierających łączenie ciągów zmiennych, jak pokazano w poniższym przykładzie, ale także do wyrażeń ze zmiennymi nieciągowymi lub += operatorami stylów. Zamiast tego należy używać funkcji agregacji dla operacji opartej na zestawie zamiast operacji wiersz po wierszu.

W przypadku łączenia ciągów należy rozważyć funkcję STRING_AGG, wprowadzoną w SQL Server 2017 (14.x), w scenariuszach, w których wymagana jest uporządkowana łączenie ciągów. Aby uzyskać więcej informacji, zobacz STRING_AGG.

W poniższym przykładzie pokazano antywzorzec, aby uniknąć. Użycie ORDER BY polecenia w celu uporządkowania łączenia powoduje, że lista jest niekompletna:

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;

Oto zestaw wyników.

(No column name)
---
Walker

Zamiast tego rozważ:

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;

Oto zestaw wyników.

(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