Sdílet prostřednictvím


VYBRAT @local_variable (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsKoncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Nastaví místní proměnnou na hodnotu výrazu.

Pro přiřazování proměnných doporučujeme místo příkazu SELECT @SET @local_variable použít.

Transact-SQL konvence syntaxe

Syntax

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

Arguments

@ local_variable

Deklarovaná proměnná, pro kterou má být přiřazena hodnota.

{ = | += | -= | *= | /= | %= | &= | ^= | |=}
Přiřaďte hodnotu vpravo proměnné vlevo.

Operátor složeného přiřazení:

Operator Action
= Přiřadí následující výraz proměnné.
+= Přidat a přiřadit
-= Odečtení a přiřazení
*= Násobení a přiřazení
/= Dělit a přiřazovat
%= Modulo a přiřazení
&= Bitový operátor AND a přiřazení
^= Bitový XOR a přiřazení
|= Bitový operátor OR a přiřazení

expression

Libovolný platný výraz. To zahrnuje skalární poddotaz.

Remarks

SELECT @local_variable se obvykle používá k vrácení jedné hodnoty do proměnné. Pokud je však výraz názvem sloupce, může vrátit více hodnot. Pokud příkaz SELECT vrátí více než jednu hodnotu, je proměnná přiřazena poslední vrácenou hodnotu.

Pokud příkaz SELECT nevrátí žádné řádky, proměnná si zachová její současnou hodnotu. Pokud je výraz skalární poddotaz, který nevrací žádnou hodnotu, proměnná je nastavená na HODNOTU NULL.

Jeden příkaz SELECT může inicializovat více místních proměnných.

Note

Příkaz SELECT, který obsahuje přiřazení proměnné, nelze použít k provádění obvyklých operací načtení sady výsledků.

Examples

A. Použití příkazu SELECT @local_variable k vrácení jedné hodnoty

V následujícím příkladu má proměnná @var1 přiřazenou hodnotu "Obecný název". Dotaz na Store tabulku nevrací žádné řádky, protože hodnota zadaná pro CustomerID tabulku neexistuje. Proměnná zachovává hodnotu "Obecný název".

Tento příklad používá AdventureWorksLT ukázkovou databázi, další informace najdete v tématu Ukázkové databáze AdventureWorks. Databáze AdventureWorksLT se používá jako ukázková databáze pro 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';

Tady je soubor výsledků.

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

B. Použití příkazu SELECT @local_variable k vrácení hodnoty null

V následujícím příkladu se poddotaz používá k přiřazení hodnoty .@var1 Vzhledem k tomu, že hodnota požadovaná pro CustomerID neexistuje, poddotaz nevrátí žádnou hodnotu a proměnná je nastavena na NULLhodnotu .

Tento příklad používá AdventureWorksLT ukázkovou databázi, další informace najdete v tématu Ukázkové databáze AdventureWorks. Databáze AdventureWorksLT se používá jako ukázková databáze pro 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';

Tady je soubor výsledků.

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

C. Antipattern použití rekurzivního přiřazení proměnné

Vyhněte se následujícímu vzoru pro rekurzivní použití proměnných a výrazů:

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

V tomto případě není zaručeno, že @Var by se aktualizovaly na řádek podle řádku. Může být například @Var nastavena na počáteční hodnotu @Var pro všechny řádky. Důvodem je to, že pořadí a frekvence zpracování přiřazení nejsou neurčetná. To platí pro výrazy obsahující zřetězení řetězců proměnných, jak je znázorněno níže, ale také pro výrazy s neřetězcovými proměnnými nebo += operátory stylu. Místo operace založené na sadě místo operace po řádku použijte agregační funkce.

Pro zřetězení řetězců zvažte STRING_AGG místo toho funkci zavedenou v SQL Serveru 2017 (14.x) pro scénáře, ve kterých je žádoucí zřetězení seřazených řetězců. Další informace najdete v tématu STRING_AGG (Transact-SQL).

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .

Příklad, který se má vyhnout, kdy použití FUNKCE ORDER BY při pokusu o zřetězení způsobí neúplný seznam:

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;

Výsledná sada:

(No column name)
---
Walker

Místo toho zvažte:

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;

Výsledná sada:

(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

Viz také

Další kroky