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


DEKLARÁL @local_variable (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 változók egy köteg vagy eljárás törzsében vannak deklarálva az DECLARE utasítással, és értékeket rendelnek hozzájuk egy vagy SET utasítás SELECT használatával. A kurzorváltozók ezzel az utasítással deklarálhatók, és más kurzorral kapcsolatos utasításokkal is használhatók. A deklaráció után az összes változó inicializálva NULLlesz, kivéve, ha egy érték szerepel a deklarációban.

Transact-SQL szintaxis konvenciók

Syntax

A következő szintaxis az SQL Server és az Azure SQL Database esetében van:

DECLARE
{
  { @local_variable [AS] data_type [ = value ] }
  | { @cursor_variable_name CURSOR }
| { @table_variable_name [AS] <table_type_definition> }
} [ , ...n ]

<table_type_definition> ::=
    TABLE ( { <column_definition> | <table_constraint> | <table_index> } } [ , ...n ] )

<column_definition> ::=
    column_name { scalar_data_type | AS computed_column_expression }
    [ COLLATE collation_name ]
    [ [ DEFAULT constant_expression ] | IDENTITY [ (seed, increment ) ] ]
    [ ROWGUIDCOL ]
    [ <column_constraint> ]
    [ <column_index> ]

<column_constraint> ::=
{
    [ NULL | NOT NULL ]
    { PRIMARY KEY | UNIQUE }
      [ CLUSTERED | NONCLUSTERED ]
      [ WITH FILLFACTOR = fillfactor
        | WITH ( < index_option > [ , ...n ] )
      [ ON { filegroup | "default" } ]
  | [ CHECK ( logical_expression ) ] [ , ...n ]
}

<column_index> ::=
    INDEX index_name [ CLUSTERED | NONCLUSTERED ]
    [ WITH ( <index_option> [ , ... n ] ) ]
    [ ON { partition_scheme_name (column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

<table_constraint> ::=
{
    { PRIMARY KEY | UNIQUE }
      [ CLUSTERED | NONCLUSTERED ]
      ( column_name [ ASC | DESC ] [ , ...n ]
        [ WITH FILLFACTOR = fillfactor
        | WITH ( <index_option> [ , ...n ] )
  | [ CHECK ( logical_expression ) ] [ , ...n ]
}

<table_index> ::=
{
    {
      INDEX index_name  [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ]
         (column_name [ ASC | DESC ] [ , ... n ] )
    | INDEX index_name CLUSTERED COLUMNSTORE
    | INDEX index_name [ NONCLUSTERED ] COLUMNSTORE ( column_name [ , ... n ] )
    }
    [ WITH ( <index_option> [ , ... n ] ) ]
    [ ON { partition_scheme_name ( column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
}

<index_option> ::=
{
  PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | STATISTICS_INCREMENTAL = { ON | OFF }
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
  | COMPRESSION_DELAY = { 0 | delay [ Minutes ] }
  | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }
       [ ON PARTITIONS ( { partition_number_expression | <range> }
       [ , ...n ] ) ]
  | XML_COMPRESSION = { ON | OFF }
      [ ON PARTITIONS ( { <partition_number_expression> | <range> }
      [ , ...n ] ) ] ]
}

Az alábbi szintaxis az Azure Synapse Analytics, a párhuzamos adattárház és a Microsoft Fabric esetében használható:

DECLARE
{ { @local_variable [AS] data_type } [ = value [ COLLATE <collation_name> ] ] } [ , ...n ]

Arguments

@ local_variable

Egy változó neve. A változóneveknek at (@) jellel kell kezdődniük. A helyi változóneveknek meg kell felelniük az azonosítókra vonatkozó szabályoknak.

  • data_type

    Bármilyen rendszer által biztosított, közös nyelvi futtatókörnyezet (CLR) felhasználó által definiált táblatípus vagy alias adattípus. A változók nem lehetnek szöveges, ntext vagy kép típusúak.

    A rendszer adattípusairól további információt az Adattípusok című témakörben talál. További információ a CLR felhasználó által definiált típusairól vagy alias adattípusairól: CREATE TYPE.

  • = érték

    Egy értéket rendel hozzá a változóhoz a sorban. Az érték lehet állandó vagy kifejezés, de meg kell egyeznie a változó deklarálási típusával, vagy implicit módon átalakíthatónak kell lennie erre a típusra. További információ: Kifejezések.

@ cursor_variable_name

A kurzorváltozó neve. A kurzorváltozó nevének egy at (@) jellel kell kezdődnie, és meg kell felelnie az azonosítók szabályainak.

  • KURZOR

    Azt adja meg, hogy a változó egy helyi kurzorváltozó.

  • @ table_variable_name

    Egy típusú tábla változójának neve. A változóneveknek at (@) jellel kell kezdődniük, és meg kell felelniük az azonosítók szabályainak.

  • <table_type_definition>

    A tábla adattípusát határozza meg. A tábladeklaráció oszlopdefiníciókat, neveket, adattípusokat és korlátozásokat tartalmaz. Az egyetlen engedélyezett kényszertípus: PRIMARY KEY, UNIQUE, NULLés CHECK. Az alias adattípus nem használható oszlop skaláris adattípusként, ha egy szabály vagy alapértelmezett definíció a típushoz van kötve.

<table_type_definition>

Egy tábla definiálásához használt információ részhalmaza a következőben CREATE TABLE: . Az elemeket és az alapvető definíciókat itt találja. További információ: CREATE TABLE.

  • n

    Egy helyőrző, amely azt jelzi, hogy több változó is megadható és hozzárendelhető érték. Táblaváltozók deklarálásakor a táblaváltozónak kell lennie az egyetlen deklarált változónak az utasításban.DECLARE

column_name

A tábla oszlopának neve.

  • scalar_data_type

    Megadja, hogy az oszlop skaláris adattípus-e.

  • computed_column_expression

    Egy számított oszlop értékét meghatározó kifejezés. A számítás egy kifejezésből történik, amely ugyanazon tábla más oszlopait használja. Egy számított oszlop például rendelkezhet a definícióval cost AS price * qty. A kifejezés lehet egy nem megfelelő oszlopnév, állandó, beépített függvény, változó vagy a beállítások egy vagy több operátor által összekapcsolt kombinációja. A kifejezés nem lehet al lekérdezés vagy felhasználó által definiált függvény. A kifejezés nem hivatkozhat felhasználó által definiált CLR-típusra.

[ ÖSSZEGYŰJTIK collation_name ]

Megadja az oszlop rendezési adatait. collation_name lehet Windows-rendezési név vagy SQL-rendezési név, és csak a karakter, a varchar, a szöveg, az nchar, az nvarchar és az ntext adattípusok oszlopaira alkalmazható. Ha nincs megadva, az oszlophoz a felhasználó által megadott adattípus rendezése (ha az oszlop felhasználó által definiált adattípus) vagy az aktuális adatbázis rendezése van hozzárendelve.

A Windows és az SQL-rendezés nevével kapcsolatos további információkért lásd a COLLATE című témakört.

DEFAULT

Az oszlophoz megadott értéket adja meg, ha egy érték nincs explicit módon megadva a beszúrás során. DEFAULT a definíciók bármely oszlopra alkalmazhatók, kivéve az időbélyegként vagy a IDENTITY tulajdonsággal definiált oszlopokat. DEFAULT a tábla elvetésekor a definíciók törlődnek. Csak állandó érték, például karaktersztring; rendszerfüggvény, például egy SYSTEM_USER(); vagy NULL alapértelmezettként használható. Az SQL Server korábbi verzióival való kompatibilitás fenntartása érdekében kényszernév rendelhető hozzá egy DEFAULT.

  • constant_expression

    Az oszlop alapértelmezett értékeként használt állandó NULLvagy rendszerfüggvény.

IDENTITY

Azt jelzi, hogy az új oszlop egy identitásoszlop. Amikor új sort ad hozzá a táblához, az SQL Server egyedi növekményes értéket biztosít az oszlophoz. Az identitásoszlopokat gyakran használják megkötésekkel PRIMARY KEY a tábla egyedi sorazonosítójaként. A IDENTITY tulajdonság a tinyint, smallint, int, decimális(p,0) vagy numerikus(p;0) oszlopokhoz rendelhető. Táblánként csak egy identitásoszlop hozható létre. A kötött alapértelmezett értékek és DEFAULT megkötések nem használhatók identitásoszlopokkal. Meg kell adnia a magot és a növekményt, vagy egyiket sem. Ha egyik sincs megadva, az alapértelmezett érték (1,1).

  • seed

    A táblába betöltött első sorhoz használt érték.

  • increment

    A betöltött előző sor identitásértékéhez hozzáadott növekményes érték.

ROWGUIDCOL

Azt jelzi, hogy az új oszlop egy sor globális egyedi azonosító oszlopa. Táblánként csak egy uniqueidentifier oszlop jelölhető ki oszlopként ROWGUIDCOL . A ROWGUIDCOL tulajdonság csak egy uniqueidentifier oszlophoz rendelhető hozzá.

NULL | NEM NULL

Azt jelzi, hogy a változóban engedélyezve van-e a null érték. Az alapértelmezett érték a NULL.

ELSŐDLEGES KULCS

Olyan kényszer, amely egy adott oszlop vagy oszlop entitásintegritását kényszeríti ki egy egyedi indexen keresztül. Táblánként csak egy PRIMARY KEY korlátozás hozható létre.

UNIQUE

Olyan korlátozás, amely egy adott oszlop vagy oszlop entitásintegritását biztosítja egy egyedi indexen keresztül. Egy tábla több korlátozással is UNIQUE rendelkezhet.

FÜRTÖZÖTT | NEMCLUSTERED

Azt jelzi, hogy egy fürtözött vagy nemclustered index jön létre a korlátozáshoz vagy PRIMARY KEY a UNIQUE korlátozáshoz. PRIMARY KEY korlátozásokat használ CLUSTERED, a kényszereket pedig UNIQUE használja NONCLUSTERED.

CLUSTERED csak egy korlátozáshoz adható meg. Ha CLUSTERED egy kényszerhez UNIQUE van megadva, és PRIMARY KEY egy kényszer is meg van adva, akkor a felhasználások PRIMARY KEYNONCLUSTERED.

CHECK

Olyan kényszer, amely a tartomány integritását kényszeríti ki az oszlopokba vagy oszlopokba beírható lehetséges értékek korlátozásával.

  • logical_expression

    Egy logikai kifejezés, amely visszaadja TRUE vagy FALSE.

<index_option>

Egy vagy több indexbeállítást határoz meg. Az indexek nem hozhatók létre explicit módon a táblaváltozókon, és a táblaváltozók nem őriznek meg statisztikákat. Az SQL Server 2014 (12.x) olyan szintaxist vezetett be, amely lehetővé teszi bizonyos indextípusok beágyazott létrehozását a tábladefinícióval. Ezzel a szintaxissal indexeket hozhat létre táblaváltozókon a tábladefiníció részeként. Bizonyos esetekben a teljesítmény javulhat ideiglenes táblák használatával, amelyek teljes körű indextámogatást és statisztikákat biztosítanak.

A beállítások teljes leírását a CREATE TABLE (TÁBLA LÉTREHOZÁSA) című témakörben talál.

Táblaváltozók és sorbecslések

A táblaváltozók nem rendelkeznek terjesztési statisztikával. Az optimalizáló sok esetben egy lekérdezési tervet hoz létre abból a feltételezésből, hogy a táblaváltozó nulla sorból vagy egy sorból áll. További információkért tekintse át a tábla adattípusát – Korlátozások és korlátozások.

Ezért óvatosnak kell lennie a táblaváltozó használata során, ha nagyobb számú sort vár (100-nál nagyobb). Fontolja meg a következő alternatívákat:

  • A temp táblák jobb megoldást jelenthetnek, mint a táblázatváltozók, ha lehetséges, hogy a sorszám nagyobb (100-nál nagyobb).

  • A táblaváltozót más táblákkal összekapcsoló lekérdezésekhez használja a RECOMPILE tippet, amely miatt az optimalizáló a táblázatváltozó megfelelő számosságát használja.

  • Az Azure SQL Database-ben és az SQL Server 2019-től kezdve (15.x) a táblaváltozó késleltetett fordítási funkciója propagálja a táblaváltozók sorszámán alapuló számosságbecsléseket, így pontosabb sorszámot biztosít a végrehajtási terv optimalizálásához. További információ: Intelligens lekérdezésfeldolgozás SQL-adatbázisokban.

Remarks

A változókat gyakran használják kötegekben vagy eljárásokban számlálóként WHILE, LOOPvagy blokkokhoz IF...ELSE .

A változók csak kifejezésekben használhatók, objektumnevek vagy kulcsszavak helyett nem. Dinamikus SQL-utasítások létrehozásához használja EXECUTEa következőt: .

A helyi változó hatóköre az a köteg, amelyben deklarálva van.

A táblaváltozók nem feltétlenül memóriabeli rezidensek. Memóriaterhelés esetén a táblázatváltozóhoz tartozó lapok leküldhetők a következőre tempdb: .

Beágyazott indexet egy táblaváltozóban definiálhat.

Egy kurzorváltozó, amelyhez jelenleg hozzárendelt kurzor van, forrásként hivatkozhat a következőben:

  • CLOSE állítás
  • DEALLOCATE állítás
  • FETCH állítás
  • OPEN állítás
  • DELETE Pozíció vagy UPDATE utasítás
  • SET CURSOR változó utasítás (a jobb oldalon)

Ezen utasítások mindegyikében az SQL Server hibát jelez, ha egy hivatkozott kurzorváltozó létezik, de jelenleg nincs hozzá hozzárendelve kurzor. Ha egy hivatkozott kurzorváltozó nem létezik, az SQL Server ugyanazt a hibát eredményezi egy másik típusú be nem jelentett változó esetében.

Kurzorváltozó:

  • Lehet egy kurzortípus vagy egy másik kurzorváltozó célpontja. További információért lásd SET @local_variable.

  • Egy utasítás kimeneti kurzorparaméterének EXECUTE céljaként hivatkozhat rá, ha a kurzorváltozóhoz jelenleg nincs hozzárendelve kurzor.

  • A kurzorra mutató mutatónak kell tekinteni.

Examples

A cikkben szereplő kódminták a AdventureWorks2025AdventureWorksDW2025 kezdőlapjáról letölthető adatbázist vagy mintaadatbázist használják.

A. A DEKLAR HASZNÁLATA

Az alábbi példa egy helyi változót használ a névvel kezdődő @find összes családnév kapcsolattartási adatainak lekéréséhez Man.

USE AdventureWorks2022;
GO

DECLARE @find AS VARCHAR (30);
/* Also allowed:
DECLARE @find VARCHAR(30) = 'Man%';
*/

SET @find = 'Man%';

SELECT p.LastName,
       p.FirstName,
       ph.PhoneNumber
FROM Person.Person AS p
     INNER JOIN Person.PersonPhone AS ph
         ON p.BusinessEntityID = ph.BusinessEntityID
WHERE LastName LIKE @find;

Itt van az eredmények összessége.

LastName            FirstName               Phone
------------------- ----------------------- -------------------------
Manchepalli         Ajay                    1 (11) 500 555-0174
Manek               Parul                   1 (11) 500 555-0146
Manzanares          Tomas                   1 (11) 500 555-0178

B. A DEKLAR FÜGGVÉNY használata két változóval

Az alábbi példa lekéri az Adventure Works Cycles értékesítési képviselőinek nevét, akik az észak-amerikai értékesítési területen találhatók, és legalább 2 000 000 dollár értékű értékesítéssel rendelkeznek az év során.

USE AdventureWorks2022;
GO

SET NOCOUNT ON;
GO

DECLARE @Group AS NVARCHAR (50), @Sales AS MONEY;

SET @Group = N'North America';
SET @Sales = 2000000;
SET NOCOUNT OFF;

SELECT FirstName,
       LastName,
       SalesYTD
FROM Sales.vSalesPerson
WHERE TerritoryGroup = @Group
      AND SalesYTD >= @Sales;

C. Típustáblázat változójának deklarálása

Az alábbi példa létrehoz egy változót table , amely az utasítás záradékában OUTPUTUPDATE megadott értékeket tárolja. Két SELECT utasítás követi a @MyTableVar értékeit és a frissítési művelet eredményeit a Employee táblában. Az oszlop eredményei INSERTED.ModifiedDate eltérnek a tábla oszlopában lévő ModifiedDateEmployee értékektől. Ennek az az oka, hogy az AFTER UPDATE eseményindító, amely frissíti az aktuális dátum értékét ModifiedDate , a Employee táblában van definiálva. A OUTPUT visszaadott oszlopok azonban az eseményindítók indítása előtt tükrözik az adatokat. További információ: OUTPUT záradék.

USE AdventureWorks2022;
GO

DECLARE @MyTableVar TABLE (
    EmpID INT NOT NULL,
    OldVacationHours INT,
    NewVacationHours INT,
    ModifiedDate DATETIME);

UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25
OUTPUT INSERTED.BusinessEntityID,
    DELETED.VacationHours,
    INSERTED.VacationHours,
    INSERTED.ModifiedDate
INTO @MyTableVar;

--Display the result set of the table variable.
SELECT EmpID,
       OldVacationHours,
       NewVacationHours,
       ModifiedDate
FROM @MyTableVar;
GO

--Display the result set of the table.
--Note that ModifiedDate reflects the value generated by an
--AFTER UPDATE trigger.
SELECT TOP (10) BusinessEntityID,
                VacationHours,
                ModifiedDate
FROM HumanResources.Employee;
GO

D. Típustábla változójának deklarálása beágyazott indexekkel

Az alábbi példa létrehoz egy változót table egy fürtözött beágyazott index és két nemclustered beágyazott index használatával.

DECLARE @MyTableVar TABLE (
    EmpID INT NOT NULL,
    PRIMARY KEY CLUSTERED (EmpID),
    UNIQUE NONCLUSTERED (EmpID),
    INDEX CustomNonClusteredIndex NONCLUSTERED (EmpID));
GO

Az alábbi lekérdezés az előző lekérdezésben létrehozott indexekről ad vissza információkat.

SELECT * FROM tempdb.sys.indexes
WHERE object_id < 0;
GO

E. Felhasználó által definiált táblatípus változójának deklarálása

Az alábbi példa egy táblaértékű paramétert vagy táblaváltozót hoz létre.@LocationTVP Ehhez a lépéshez egy megfelelő, felhasználó által definiált táblatípusra LocationTableTypevan szükség.

További információ a felhasználó által definiált táblatípus létrehozásáról: CREATE TYPE. A táblaértékű paraméterekkel kapcsolatos további információkért lásd: Táblaértékű paraméterek használata (adatbázismotor).

DECLARE @LocationTVP AS LocationTableType;

Példák: Azure Synapse Analytics and Analytics Platform System (PDW)

F. A DEKLAR HASZNÁLATA

Az alábbi példa egy helyi változót használ a névvel kezdődő @find összes családnév kapcsolattartási adatainak lekéréséhez Walt.

-- Uses AdventureWorks
DECLARE @find AS VARCHAR (30);
/* Also allowed:
DECLARE @find VARCHAR(30) = 'Man%';
*/

SET @find = 'Walt%';

SELECT LastName,
       FirstName,
       Phone
FROM DimEmployee
WHERE LastName LIKE @find;

G. A DEKLAR FÜGGVÉNY használata két változóval

Az alábbi példa változók használatával adja meg a táblában szereplő DimEmployee alkalmazottak vezeték- és családnevét.

DECLARE @lastName AS VARCHAR (30),
    @firstName AS VARCHAR (30);

SET @lastName = 'Walt%';
SET @firstName = 'Bryan';

SELECT LastName,
       FirstName,
       Phone
FROM DimEmployee
WHERE LastName LIKE @lastName
      AND FirstName LIKE @firstName;