Megosztás:


Változók (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)SQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

A Transact-SQL helyi változók olyan objektumok, amelyek egyetlen, adott típusú adatértéket tartalmazhatnak. A változókat általában kötegekben és szkriptekben használja a következő célokra:

  • A változók számlálóként való használatával megszámolhatja a ciklusok végrehajtásának számát, vagy beállíthatja, hogy a ciklus hányszor legyen végrehajtva.
  • Tartsa lenyomva az adatértéket a folyamatvezérlési utasítással való teszteléshez.
  • Mentsen egy adatértéket, hogy egy tárolt eljárás visszaadja a visszaadott kódot vagy függvény visszatérési értékét.

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

Remarks

Egyes Transact-SQL rendszerfüggvények neve két jellel kezdődik (@@). Bár az SQL Server korábbi verziói globális változókként hivatkoznak a @@ függvényekre, @@ a függvények nem változók, és nem ugyanazokkal a viselkedésekkel rendelkeznek, mint a változók. A @@ függvények rendszerfüggvények, szintaxisuk pedig a függvényekre vonatkozó szabályokat követi.

Nézetben nem használhat változókat.

A változók módosításait nem befolyásolja a tranzakció visszaállítása.

Transact-SQL változó deklarálása

Az utasítással DECLARE inicializálhat egy Transact-SQL változót a következővel:

  • Név hozzárendelése. A névnek egyetlen @ karakterrel kell kezdődnie.

  • Rendszer által biztosított vagy felhasználó által definiált adattípus és hossz hozzárendelése. Numerikus változók esetén pontosságot és opcionális skálázást rendelhet hozzá. XML típusú változókhoz szükség esetén sémagyűjteményt is hozzárendelhet.

  • Az érték beállítása a következőre NULL: .

Az alábbi DECLARE utasítás például létrehoz egy int adattípusú helyi @mycounter. Alapértelmezés szerint ennek a változónak az értéke .NULL

DECLARE @MyCounter AS INT;

Egynél több helyi változó deklarálásához használjon vesszőt az első helyi változó definíciója után, majd adja meg a következő helyi változó nevét és adattípusát.

A következő DECLARE utasítás például három helyi változót @LastNamehoz létre , @FirstNameés @StateProvinceinicializálja azokat NULL:

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

Egy másik példában a következő DECLARE utasítás létrehoz egy logikai változót@IsActive, amely bitként van deklarálva a (0) értékkel false :

DECLARE @IsActive AS BIT = 0;

Változó hatókör

A változó hatóköre a változóra hivatkozó Transact-SQL utasítások tartománya. A változó hatóköre a deklarált ponttól a deklarált köteg vagy tárolt eljárás végéig tart, amelyben deklarálva van. A következő szkript például szintaxishibát generál, mert a változó egy kötegben van deklarálva (a GO kulcsszóval elválasztva), és egy másikban hivatkozik rá:

USE AdventureWorks2025;
GO

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

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

A változók helyi hatókörrel rendelkeznek, és csak abban a kötegben vagy eljárásban láthatók, ahol ön definiálja őket. Az alábbi példában a végrehajtáshoz sp_executesql létrehozott beágyazott hatókör nem fér hozzá a magasabb hatókörben deklarált változóhoz, és hibát ad vissza.

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

EXECUTE sp_executesql N'SELECT @MyVariable';

Ez a lekérdezés a következő hibát eredményezi:

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

Érték beállítása Transact-SQL változóban

Amikor először deklarál egy változót, annak értéke .NULL Ha értéket szeretne hozzárendelni egy változóhoz, használja az utasítást SET . Ez a módszer az előnyben részesített módszer egy érték változóhoz való hozzárendelésére. Egy változóhoz úgy is hozzárendelhet értéket, hogy hivatkozik rá egy utasítás kiválasztási SELECT listájában.

Ha egy változót az utasítással SET szeretne hozzárendelni egy értékhez, adja meg a változó nevét és a változóhoz rendelendő értéket. Ez a módszer az előnyben részesített módszer egy érték változóhoz való hozzárendelésére. A következő köteg például két változót deklarál, értékeket rendel hozzájuk, majd egy WHERE utasítás záradékában SELECT használja őket:

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;

Egy változóhoz úgy is hozzárendelhet értéket, hogy egy kijelölési listában hivatkozik rá. Ha egy választólistában hivatkozik egy változóra, rendeljen hozzá skaláris értéket, vagy győződjön meg arról, hogy az SELECT utasítás csak egy sort ad vissza. Például:

USE AdventureWorks2025;
GO

DECLARE @EmpIDVariable AS INT;

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

Warning

Ha egyetlen SELECT utasításban több hozzárendelési záradék is szerepel, az adatbázismotor nem garantálja a kifejezések kiértékelési sorrendjét. Az effektusok csak akkor láthatók, ha a hozzárendelések között hivatkozások találhatók.

Ha egy SELECT utasítás több sort ad vissza, és a változó egy nem skálázható kifejezésre hivatkozik, a változó az eredményhalmaz utolsó sorában lévő kifejezéshez visszaadott értékre van állítva. Az alábbi kötegben @EmpIDVariable például az BusinessEntityID utolsó visszaadott sor értéke van beállítva, amely a következő 1:

USE AdventureWorks2025;
GO

DECLARE @EmpIDVariable AS INT;

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

SELECT @EmpIDVariable;

Examples

A következő szkript létrehoz egy kis teszttáblát, és 26 sorból tölti ki. A szkript egy változóval három dolgot hajt végre:

  • A ciklus végrehajtásának hányszorosával szabályozhatja, hogy hány sor legyen beszúrva.
  • Adja meg az egész szám oszlopba beszúrt értéket.
  • Függvény a karakteroszlopba beszúrni kívánt betűket generáló kifejezés részeként.
-- 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;