Sdílet prostřednictvím


Proměnné (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Místní proměnná Transact-SQL je objekt, který může obsahovat jednu datovou hodnotu určitého typu. Proměnné se obvykle používají v dávkách a skriptech pro následující účely:

  • Pomocí proměnné jako čítače můžete spočítat, kolikrát se smyčka provádí, nebo určit, kolikrát se smyčka provádí.
  • Podržte hodnotu dat, kterou chcete testovat pomocí příkazu control-of-flow.
  • Uložte datovou hodnotu, kterou vrátí uložená procedura, vrátí kód nebo návratovou hodnotu funkce.

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 .

Remarks

Názvy některých systémových funkcí Transact-SQL začínají dvěma písmeny (@@). I když starší verze SQL Serveru odkazují na @@ funkce jako globální proměnné, @@ funkce nejsou proměnné a nemají stejné chování jako proměnné. Funkce @@ jsou systémové funkce a jejich použití syntaxe se řídí pravidly pro funkce.

Proměnné nemůžete použít v zobrazení.

Změny proměnných nejsou ovlivněny vrácením transakce zpět.

Deklarace proměnné Transact-SQL

DECLARE Pomocí příkazu inicializujete Transact-SQL proměnnou podle:

  • Přiřazení názvu Název musí začínat jedním @ znakem.

  • Přiřazení systémového nebo uživatelem definovaného datového typu a délky U číselných proměnných můžete přiřadit přesnost a volitelné měřítko. U proměnných typu XML můžete volitelně přiřadit kolekci schémat.

  • Nastavení hodnoty na NULLhodnotu .

Následující příkaz například DECLARE vytvoří místní proměnnou s datovým @mycounter typem int . Ve výchozím nastavení je NULLhodnota této proměnné .

DECLARE @MyCounter AS INT;

Chcete-li deklarovat více než jednu místní proměnnou, použijte čárku za první definici místní proměnné a potom zadejte další název místní proměnné a datový typ.

Následující příkaz například DECLARE vytvoří tři místní proměnné s názvem @LastName, @FirstNamea @StateProvincea inicializuje je na NULL:

DECLARE @LastName AS NVARCHAR (30),
        @FirstName AS NVARCHAR (20),
        @StateProvince AS NCHAR (2);

V jiném příkladu následující DECLARE příkaz vytvoří logickou proměnnou s názvem @IsActive, která je deklarována jako bit s hodnotou 0 (false):

DECLARE @IsActive AS BIT = 0;

Proměnný rozsah

Rozsah proměnné je rozsah příkazů Transact-SQL, které mohou odkazovat na proměnnou. Rozsah proměnné trvá od bodu, který je deklarován až do konce dávky nebo uložené procedury, ve které je deklarována. Například následující skript vygeneruje chybu syntaxe, protože proměnná je deklarována v jedné dávce (oddělená klíčovým slovem GO ) a odkazuje na ni v jiné:

USE AdventureWorks2025;
GO

DECLARE @MyVariable AS INT;
SET @MyVariable = 1;

SELECT BusinessEntityID,
       NationalIDNumber,
       JobTitle
FROM HumanResources.Employee
WHERE BusinessEntityID = @MyVariable;

Proměnné mají místní obor a jsou viditelné pouze v dávce nebo postupu, kde je definujete. V následujícím příkladu nemá vnořený obor vytvořený pro spuštění sp_executesql proměnné deklarovanou ve vyšším oboru přístup a vrátí chybu.

DECLARE @MyVariable AS INT;
SET @MyVariable = 1;

EXECUTE sp_executesql N'SELECT @MyVariable';

Tento dotaz vytvoří následující chybu:

Msg 137, Level 15, State 2, Line 1
Must declare the scalar variable "@MyVariable".

Nastavení hodnoty v proměnné Transact-SQL

Když poprvé deklarujete proměnnou, její hodnota je NULL. K přiřazení hodnoty proměnné použijte SET příkaz. Tato metoda je upřednostňovaným způsobem přiřazení hodnoty proměnné. Hodnotu můžete k proměnné přiřadit také tak, že na ni odkazujete v seznamu select příkazu SELECT .

Pokud chcete proměnné přiřadit hodnotu pomocí SET příkazu, zadejte název proměnné a hodnotu, kterou chcete proměnné přiřadit. Tato metoda je upřednostňovaným způsobem přiřazení hodnoty proměnné. Následující dávka například deklaruje dvě proměnné, přiřadí jim hodnoty a pak je použije v WHERE klauzuli SELECT příkazu:

USE AdventureWorks2025;
GO

-- Declare two variables.
DECLARE @FirstNameVariable AS NVARCHAR (50),
        @PostalCodeVariable AS NVARCHAR (15);

-- Set their values.
SET @FirstNameVariable = N'Amy';
SET @PostalCodeVariable = N'BA5 3HX';

-- Use them in the WHERE clause of a SELECT statement.
SELECT LastName,
       FirstName,
       JobTitle,
       City,
       PostalCode,
       StateProvinceName,
       CountryRegionName
FROM HumanResources.vEmployee
WHERE FirstName = @FirstNameVariable
      OR PostalCode = @PostalCodeVariable;

Hodnotu můžete k proměnné přiřadit také tak, že na ni odkazujete v seznamu výběru. Pokud odkazujete na proměnnou v seznamu select, přiřaďte ji skalární hodnotu nebo zajistěte, aby SELECT příkaz vrátil pouze jeden řádek. Například:

USE AdventureWorks2025;
GO

DECLARE @EmpIDVariable AS INT;

SELECT @EmpIDVariable = MAX(BusinessEntityID)
FROM HumanResources.Employee;

Warning

Pokud v jednom SELECT příkazu existuje více klauzulí přiřazení, databázový stroj nezaručuje pořadí vyhodnocení výrazů. Efekty jsou viditelné pouze v případě, že mezi přiřazeními existují odkazy.

SELECT Pokud příkaz vrátí více než jeden řádek a proměnná odkazuje na nekalarní výraz, proměnná se nastaví na hodnotu vrácenou pro výraz v posledním řádku sady výsledků. Například v následující dávce @EmpIDVariable je nastavena hodnota BusinessEntityID posledního vráceného řádku, což je 1:

USE AdventureWorks2025;
GO

DECLARE @EmpIDVariable AS INT;

SELECT @EmpIDVariable = BusinessEntityID
FROM HumanResources.Employee
ORDER BY BusinessEntityID DESC;

SELECT @EmpIDVariable;

Examples

Následující skript vytvoří malou testovací tabulku a naplní ji 26 řádky. Skript používá proměnnou ke třem věcem:

  • Určuje, kolik řádků se vloží, a to tak, že určuje, kolikrát se smyčka spustí.
  • Zadejte hodnotu vloženou do celočíselného sloupce.
  • Funkce jako součást výrazu, který generuje písmena pro vložení do sloupce znaků.
-- Create the table.
CREATE TABLE TestTable
(
    cola INT,
    colb CHAR (3)
);

SET NOCOUNT ON;

-- Declare the variable to be used.
DECLARE @MyCounter AS INT;

-- Initialize the variable.
SET @MyCounter = 0;

-- Test the variable to see if the loop is finished.
WHILE (@MyCounter < 26)
    -- Insert a row into the table.
    BEGIN
        INSERT INTO TestTable
        -- Use the variable to provide the integer value
        -- for cola. Also use it to generate a unique letter
        -- for each row. Use the ASCII function to get the
        -- integer value of 'a'. Add @MyCounter. Use CHAR to
        -- convert the sum back to the character @MyCounter
        -- characters after 'a'.
        VALUES (
            @MyCounter,
            CHAR((@MyCounter + ASCII('a')))
        );
        -- Increment the variable to count this iteration
        -- of the loop.
        SET @MyCounter = @MyCounter + 1;
    END
SET NOCOUNT OFF;

-- View the data.
SELECT cola,
       colb
FROM TestTable;
DROP TABLE TestTable;