Dela via


Variables (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

En Transact-SQL lokal variabel är ett objekt som kan innehålla ett enda datavärde av en viss typ. Variabler i batchar och skript används vanligtvis:

  • Som räknare kan du antingen räkna antalet gånger en loop utförs eller för att styra hur många gånger loopen utförs.
  • För att lagra ett datavärde som ska testas av en kontroll-of-flow-instruktion.
  • För att spara ett datavärde som ska returneras av en lagrad procedur returnerar du kod eller funktionsreturvärde.

Remarks

Namnen på vissa Transact-SQL systemfunktioner börjar med två vid tecken (@@). Även om funktionerna i tidigare versioner av SQL Server @@ kallas globala variabler, @@ är funktioner inte variabler och de har inte samma beteenden som variabler. Funktionerna @@ är systemfunktioner och deras syntaxanvändning följer reglerna för funktioner.

Du kan inte använda variabler i en vy.

Ändringar i variabler påverkas inte av återställningen av en transaktion.

Deklarera en Transact-SQL variabel

Instruktionen DECLARE initierar en Transact-SQL variabel genom att:

  • Tilldela ett namn. Namnet måste ha en enda @ som det första tecknet.

  • Tilldela en systemangiven eller användardefinierad datatyp och en längd. För numeriska variabler tilldelas även en precision och skala. För variabler av typen XML kan en valfri schemasamling tilldelas.

  • Ange värdet till NULL.

Följande instruktion skapar till exempel DECLARE en lokal variabel med namnet @mycounter med en int-datatyp . Som standard är NULLvärdet för den här variabeln .

DECLARE @MyCounter INT;

Om du vill deklarera mer än en lokal variabel använder du ett kommatecken efter att den första lokala variabeln har definierats och anger sedan nästa lokala variabelnamn och datatyp.

Följande instruktion skapar till exempel DECLARE tre lokala variabler med namnet @LastName, @FirstName och @StateProvinceoch initierar var och en till NULL:

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

I ett annat exempel skapar följande DECLARE instruktion en boolesk variabel med namnet @IsActive, som deklareras som bit med värdet 0 (false):

DECLARE @IsActive BIT = 0;

Variable scope

Omfånget för en variabel är intervallet för Transact-SQL-instruktioner som kan referera till variabeln. Omfånget för en variabel varar från den punkt som den deklareras till slutet av batchen eller den lagrade proceduren där den deklareras. Följande skript genererar till exempel ett syntaxfel eftersom variabeln deklareras i en batch (avgränsad med nyckelordet GO ) och refereras till i en annan:

USE AdventureWorks2022;
GO

DECLARE @MyVariable INT;

SET @MyVariable = 1;
GO

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

Variabler har ett lokalt omfång och visas bara i batchen eller proceduren där de definieras. I följande exempel har det kapslade omfång som skapats för körning av sp_executesql inte åtkomst till variabeln som deklarerats i det högre omfånget och returnerar och fel.

DECLARE @MyVariable INT;
SET @MyVariable = 1;
EXECUTE sp_executesql N'SELECT @MyVariable'; -- this produces an error

Ange ett värde i en Transact-SQL variabel

När en variabel först deklareras anges dess värde till NULL. Om du vill tilldela ett värde till en variabel använder du -instruktionen SET . Det här är den bästa metoden för att tilldela ett värde till en variabel. En variabel kan också ha ett värde tilldelat genom att refereras till i väljlistan för en SELECT -instruktion.

Om du vill tilldela en variabel ett värde med hjälp av SET-instruktionen inkluderar du variabelnamnet och värdet som variabeln ska tilldelas. Det här är den bästa metoden för att tilldela ett värde till en variabel. Följande batch deklarerar till exempel två variabler, tilldelar värden till dem och använder dem sedan i instruktionens WHERE sats SELECT :

USE AdventureWorks2022;
GO

-- Declare two variables.
DECLARE @FirstNameVariable NVARCHAR(50),
    @PostalCodeVariable 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,
    StateProvinceName,
    CountryRegionName
FROM HumanResources.vEmployee
WHERE FirstName = @FirstNameVariable
    OR PostalCode = @PostalCodeVariable;
GO

En variabel kan också ha ett värde tilldelat genom att refereras till i en urvalslista. Om en variabel refereras till i en urvalslista bör den tilldelas ett skalärt värde eller så bör instruktionen SELECT bara returnera en rad. For example:

USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;

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

Warning

Om det finns flera tilldelningssatser i en enda SELECT instruktion garanterar SQL Server inte ordningen för utvärdering av uttrycken. Effekter visas bara om det finns referenser mellan tilldelningarna.

Om en SELECT instruktion returnerar mer än en rad och variabeln refererar till ett icke-skalbart uttryck, anges variabeln till det värde som returneras för uttrycket i den sista raden i resultatuppsättningen. I följande batch @EmpIDVariable anges till exempel värdet för BusinessEntityID den sista raden som returnerades, vilket är 1:

USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;

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

SELECT @EmpIDVariable;
GO

Examples

Följande skript skapar en liten testtabell och fyller den med 26 rader. Skriptet använder en variabel för att göra tre saker:

  • Kontrollera hur många rader som infogas genom att styra hur många gånger loopen körs.
  • Ange värdet som infogats i heltalskolumnen.
  • Funktion som en del av uttrycket som genererar bokstäver som ska infogas i teckenkolumnen.
-- Create the table.
CREATE TABLE TestTable (cola INT, colb CHAR(3));
GO

SET NOCOUNT ON;
GO

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

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

-- Test the variable to see if the loop is finished.
WHILE (@MyCounter < 26)
BEGIN;
    -- Insert a row into the table.
    INSERT INTO TestTable
    VALUES
        -- 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'.
        (
        @MyCounter,
        CHAR((@MyCounter + ASCII('a')))
        );

    -- Increment the variable to count this iteration
    -- of the loop.
    SET @MyCounter = @MyCounter + 1;
END;
GO

SET NOCOUNT OFF;
GO

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

DROP TABLE TestTable;
GO