Udostępnij za pomocą


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.

W przypadku przypisywania zmiennych zalecamy użycie SET @local_variable zamiast polecenia SELECT @local_variable.

Transact-SQL konwencje składni

Syntax

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

Arguments

@ local_variable

Zadeklarowana zmienna, dla której ma zostać przypisana 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 przypisz
^= Bitowe XOR i przypisywanie
|= Bitowe OR i przypisz

expression

Dowolne prawidłowe wyrażenie. Obejmuje to podzapytywanie skalarne.

Remarks

Select @local_variable jest zwykle używany do zwracania pojedynczej wartości do zmiennej. Jeśli jednak wyrażenie jest nazwą kolumny, może zwrócić wiele wartości. Jeśli instrukcja SELECT zwraca więcej niż jedną wartość, zmienna zostanie przypisana do ostatniej zwracanej wartości.

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

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

Note

Nie można użyć instrukcji SELECT zawierającej przypisanie zmiennej do wykonywania typowych operacji pobierania zestawu wyników.

Examples

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

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

W tym przykładzie użyto przykładowej AdventureWorksLT bazy danych, aby uzyskać więcej informacji, zobacz Przykładowe bazy danych AdventureWorks. Baza AdventureWorksLT danych jest używana jako przykładowa baza danych dla usługi 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';

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 służy do przypisywania wartości do @var1elementu . Ponieważ wartość żądana dla CustomerID elementu nie istnieje, podzapytywanie nie zwraca żadnej wartości, a zmienna jest ustawiona na NULLwartość .

W tym przykładzie użyto przykładowej AdventureWorksLT bazy danych, aby uzyskać więcej informacji, zobacz Przykładowe bazy danych AdventureWorks. Baza AdventureWorksLT danych jest używana jako przykładowa baza danych dla usługi 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';

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 zostanie on zaktualizowany według wiersza. Na przykład @Var można ustawić wartość początkową @Var dla wszystkich wierszy. Dzieje się tak, ponieważ kolejność i częstotliwość przetwarzania przypisań nie jest określona. Dotyczy to wyrażeń zawierających łączenie ciągów zmiennych, jak pokazano poniżej, ale także w wyrażeniach 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ć STRING_AGG funkcję wprowadzoną w programie SQL Server 2017 (14.x), w scenariuszach, w których wymagane jest uporządkowane łączenie ciągów. Aby uzyskać więcej informacji, zobacz STRING_AGG (Transact-SQL).

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.

Przykładem, aby uniknąć sytuacji, w której użycie polecenia ORDER BY 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;

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;

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

Zobacz także

Dalsze kroki