Megosztás a következőn keresztül:


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 kötegek és szkriptek változóit általában a következők használják:

  • Számlálóként vagy a ciklus végrehajtásának hányszoros számának megszámlálásához, vagy a ciklus végrehajtásának hányszorosának szabályozásához.
  • Adatérték tárolásához, amelyet egy folyamatvezérlési utasítással kell tesztelni.
  • Tárolt eljárás által visszaadandó adatérték mentése a visszaadott kód vagy függvény visszatérési értékeként.

Remarks

Egyes Transact-SQL rendszerfüggvények neve két jellel kezdődik (@@). Bár az SQL Server korábbi verzióiban a @@ függvényeket globális változóknak nevezik, @@ 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 DECLARE utasítás inicializál egy Transact-SQL változót a következővel:

  • Név hozzárendelése. A névnek egyetlen @ karakterrel kell rendelkeznie első karakterként.

  • Rendszer által biztosított vagy felhasználó által definiált adattípus és hossz hozzárendelése. Numerikus változókhoz a pontosság és a skálázás is hozzá van rendelve. XML típusú változókhoz opcionális sémagyűjtemény 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 INT;

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

Az alábbi DECLARE utasítás például három helyi változót @LastNamehoz létre, @FirstName és @StateProvinceinicializálja azokat NULL:

DECLARE @LastName NVARCHAR(30), @FirstName NVARCHAR(20), @StateProvince 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 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 AdventureWorks2022;
GO

DECLARE @MyVariable INT;

SET @MyVariable = 1;
GO

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 definiálva vannak. 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 visszaadja és hibaüzenetet ad vissza.

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

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

Egy változó első deklarálásakor az értéke a következőre NULLvan állítva: . Ha értéket szeretne hozzárendelni egy változóhoz, használja az utasítást SET . Ez az előnyben részesített módszer egy érték változóhoz való hozzárendeléséhez. A változókhoz egy érték is hozzárendelhető, ha egy utasítás kiválasztási SELECT listájában hivatkoznak rá.

Ha egy változót a SET utasítással szeretne hozzárendelni egy értékhez, adja meg a változó nevét és a változóhoz rendelendő értéket. Ez az előnyben részesített módszer egy érték változóhoz való hozzárendeléséhez. 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 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

A változókhoz a kijelölési listában hivatkozva is megadható érték. Ha egy változóra egy kijelölési listában hivatkozik, skaláris értéket kell hozzá rendelnie, vagy az SELECT utasításnak csak egy sort kell visszaadnia. Például:

USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;

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

Warning

Ha egyetlen SELECT utasításban több hozzárendelési záradék is szerepel, az SQL Server 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 AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;

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

SELECT @EmpIDVariable;
GO

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));
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