Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Koncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databáze SQL v Microsoft Fabric
Proměnné jsou deklarovány v těle dávky nebo procedury pomocí DECLARE příkazu a jsou přiřazeny hodnoty pomocí SET příkazu nebo SELECT příkazu. Proměnné kurzoru lze deklarovat pomocí tohoto příkazu a použít s jinými příkazy souvisejícími s kurzory. Po deklaraci jsou všechny proměnné inicializovány jako NULL, pokud není hodnota poskytnuta jako součást deklarace.
Syntax
Pro SQL Server a Azure SQL Database platí následující syntaxe:
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 ] ) ] ]
}
Následující syntaxe je určená pro Azure Synapse Analytics a paralelní datový sklad a Microsoft Fabric:
DECLARE
{ { @local_variable [AS] data_type } [ = value [ COLLATE <collation_name> ] ] } [ , ...n ]
Arguments
@ local_variable
Název proměnné. Názvy proměnných musí začínat znakem (@). Názvy místních proměnných musí splňovat pravidla pro identifikátory.
data_type
Všechny typy tabulek definované uživatelem definované systémem nebo datový typ aliasu (Common Language Runtime). Proměnná nemůže být typu text, ntext ani obrázek .
Další informace o systémových datovýchtypech Další informace o uživatelem definovaných typech CLR nebo datových typech aliasů najdete v tématu CREATE TYPE.
= hodnota
Přiřadí hodnotu proměnné v řádku. Hodnota může být konstanta nebo výraz, ale musí se shodovat s typem deklarace proměnné nebo musí být implicitně konvertibilní na tento typ. Další informace naleznete v tématu Výrazy.
@ cursor_variable_name
Název proměnné kurzoru. Názvy proměnných kurzoru musí začínat znakem (@) a odpovídat pravidlům pro identifikátory.
KURZOR
Určuje, že proměnná je místní proměnná kurzoru.
@ table_variable_name
Název proměnné tabulky typů. Názvy proměnných musí začínat znakem (@) a odpovídat pravidlům pro identifikátory.
<table_type_definition>
Definuje datový typ tabulky . Deklarace tabulky obsahuje definice sloupců, názvy, datové typy a omezení. Jediné povolené typy omezení jsou
PRIMARY KEY,UNIQUE,NULL, aCHECK. Datový typ aliasu nelze použít jako skalární datový typ sloupce, pokud je pravidlo nebo výchozí definice svázaná s typem.
<table_type_definition>
Podmnožina informací použitých k definování tabulky v CREATE TABLE. Tady jsou zahrnuté prvky a základní definice. Další informace najdete v tématu CREATE TABLE.
n
Zástupný symbol označující, že lze zadat a přiřadit více proměnných. Při deklarování proměnných tabulky musí být proměnná tabulky jedinou deklarovanou proměnnou v
DECLAREpříkazu.
column_name
Název sloupce v tabulce
scalar_data_type
Určuje, že sloupec je skalární datový typ.
computed_column_expression
Výraz definující hodnotu počítaného sloupce. Vypočítá se z výrazu pomocí jiných sloupců ve stejné tabulce. Počítaný sloupec může mít například definici
cost AS price * qty. Výrazem může být nekombinovaný název sloupce, konstantní, předdefinovaná funkce, proměnná nebo jakákoli kombinace těchto možností spojených jedním nebo více operátory. Výraz nemůže být poddotaz ani uživatelem definovaná funkce. Výraz nemůže odkazovat na uživatelem definovaný typ CLR.
[ SROVNÁNÍ collation_name ]
Určuje kolaci sloupce. collation_name může být buď název kolace Systému Windows, nebo název kolace SQL, a je použitelný pouze pro sloupce s datovými typy char, varchar, text, nchar, nvarchar a ntext . Pokud není zadaný, je sloupec přiřazen buď kolaci uživatelem definovaného datového typu (pokud je sloupec uživatelem definovaný datový typ) nebo kolace aktuální databáze.
Další informace o názvech kolace Windows a SQL najdete v tématu COLLATE.
DEFAULT
Určuje hodnotu zadanou pro sloupec, pokud hodnota není explicitně zadána během vložení.
DEFAULT definice lze použít u všech sloupců s výjimkou sloupců definovaných jako časové razítko nebo s IDENTITY vlastností.
DEFAULT definice se odeberou při vyřazení tabulky. Pouze konstantní hodnota, například řetězec znaků; systémovou funkci, jako SYSTEM_USER()je například ; nebo NULL lze použít jako výchozí. Chcete-li zachovat kompatibilitu se staršími verzemi SQL Serveru, je možné přiřadit název omezení .DEFAULT
constant_expression
Konstanta nebo
NULLsystémová funkce použitá jako výchozí hodnota sloupce.
IDENTITY
Označuje, že nový sloupec je sloupec identity. Při přidání nového řádku do tabulky poskytuje SQL Server jedinečnou přírůstkovou hodnotu sloupce. Sloupce identity se běžně používají s omezeními PRIMARY KEY , která slouží jako jedinečný identifikátor řádku tabulky. Vlastnost IDENTITY lze přiřadit ke sloupcům tinyint, smallint, int, decimal(p;0) nebo numeric(p;0). Pro každou tabulku je možné vytvořit pouze jeden sloupec identity. Vázané výchozí hodnoty a DEFAULT omezení nelze použít se sloupcem identity. Musíte zadat počáteční i přírůstek, nebo ani jedno. Pokud není zadán žádný z nich, výchozí hodnota je (1,1).
seed
Hodnota použitá pro první řádek načtený do tabulky.
increment
Přírůstková hodnota přidaná k hodnotě identity předchozího řádku, který byl načten.
ROWGUIDCOL
Označuje, že nový sloupec je sloupec globálního jedinečného identifikátoru řádku. Jako sloupec lze určit pouze jeden ROWGUIDCOL pro každou tabulku.
ROWGUIDCOL Vlastnost lze přiřadit pouze ke sloupci uniqueidentifier.
NULL | NE NULL
Označuje, jestli je v proměnné povolena hodnota null. Výchozí hodnota je NULL.
PRIMÁRNÍ KLÍČ
Omezení, které vynucuje integritu entity pro daný sloupec nebo sloupce prostřednictvím jedinečného indexu. Pro každou tabulku lze vytvořit pouze jedno PRIMARY KEY omezení.
UNIQUE
Omezení, které poskytuje integritu entity pro daný sloupec nebo sloupce prostřednictvím jedinečného indexu. Tabulka může mít několik UNIQUE omezení.
CLUSTERED | NECLUSTERED
Označuje, že se pro dané omezení vytvoří PRIMARY KEYUNIQUE clusterovaný nebo neclusterovaný index.
PRIMARY KEY použití CLUSTEREDomezení a UNIQUE použití NONCLUSTEREDomezení .
CLUSTERED lze zadat pouze pro jedno omezení. Je-li CLUSTERED zadán pro UNIQUE omezení a PRIMARY KEY omezení je také zadáno, PRIMARY KEY používá .NONCLUSTERED
CHECK
Omezení, které vynucuje integritu domény omezením možných hodnot, které lze zadat do sloupce nebo sloupců.
logical_expression
Logický výraz, který vrací
TRUEneboFALSE.
<index_option>
Určuje jednu nebo více možností indexu. Indexy nelze explicitně vytvářet u proměnných tabulky a v proměnných tabulky se neuchovávají žádné statistiky. SQL Server 2014 (12.x) zavedl syntaxi, která umožňuje vytvořit určité typy indexů vložené s definicí tabulky. Pomocí této syntaxe můžete v definici tabulky vytvořit indexy proměnných tabulky. V některých případech se výkon může zlepšit pomocí dočasných tabulek, které poskytují úplnou podporu indexů a statistiky.
Úplný popis těchto možností najdete v tématu CREATE TABLE.
Proměnné tabulky a odhady řádků
Proměnné tabulky nemají distribuční statistiky. V mnoha případech optimalizátor sestaví plán dotazu na předpokladu, že proměnná tabulky má nula řádků nebo jeden řádek. Další informace najdete v tabulkovém datovém typu – Omezení a omezení.
Z tohoto důvodu byste měli být opatrní při použití proměnné tabulky, pokud očekáváte větší počet řádků (větší než 100). Zvažte následující alternativy:
Dočasné tabulky můžou být lepším řešením než proměnné tabulky, pokud je možné, že počet řádků bude větší (větší než 100).
V případě dotazů, které spojují proměnnou tabulky s jinými tabulkami, použijte nápovědu
RECOMPILE, která způsobí, že optimalizátor použije správnou kardinalitu pro proměnnou tabulky.Ve službě Azure SQL Database a počínaje SQL Serverem 2019 (15.x) rozšíří funkce odložené kompilace proměnné tabulky odhady kardinality založené na skutečných počtech řádků proměnných tabulky a poskytuje přesnější počet řádků pro optimalizaci plánu provádění. Další informace najdete v tématu Inteligentní zpracování dotazů v databázích SQL.
Remarks
Proměnné se často používají v dávce nebo postupu jako čítače pro WHILE, LOOPnebo pro IF...ELSE blok.
Proměnné lze použít pouze ve výrazech, ne místo názvů objektů nebo klíčových slov. Chcete-li vytvořit dynamické příkazy SQL, použijte EXECUTE.
Obor místní proměnné je dávka, ve které je deklarována.
Proměnná tabulky nemusí nutně být rezidentem paměti. Pod tlakem paměti lze stránky patřící do proměnné tabulky vysunout do tempdb.
Vložený index můžete definovat v proměnné tabulky.
Proměnná kurzoru, která má aktuálně přiřazený kurzor, lze odkazovat jako na zdroj v:
-
CLOSEvýrok -
DEALLOCATEvýrok -
FETCHvýrok -
OPENvýrok -
DELETEUmístění neboUPDATEpříkaz -
SET CURSORvariable – příkaz (na pravé straně)
Ve všech těchto příkazech SQL Server vyvolá chybu, pokud odkazovaná proměnná kurzoru existuje, ale nemá k ní aktuálně přidělený kurzor. Pokud odkazovaná proměnná kurzoru neexistuje, SQL Server vyvolá stejnou chybu u nedelarované proměnné jiného typu.
Proměnná kurzoru:
Může být cílem typu kurzoru nebo jiné proměnné kurzoru. Další informace najdete v tématu SET @local_variable.
Lze odkazovat jako na cíl výstupního parametru kurzoru
EXECUTEv příkazu, pokud proměnná kurzoru nemá aktuálně přiřazený kurzor.Měl by být považován za ukazatel na kurzor.
Examples
Ukázky kódu v tomto článku používají AdventureWorks2025 ukázkovou databázi, AdventureWorksDW2025 kterou si můžete stáhnout z domovské stránky Ukázky a projekty komunity Microsoft SQL Serveru .
A. Použití DEKLARACE
Následující příklad používá místní proměnnou pojmenovanou @find k načtení kontaktních informací pro všechna rodinná jména začínající na 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;
Tady je soubor výsledků.
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. Použití DEKLARACÍ se dvěma proměnnými
Následující příklad načte názvy prodejních zástupců společnosti Adventure Works Cycles, kteří se nacházejí na území prodeje Severní Ameriky, a za rok mají alespoň 2 000 000 USD.
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. Deklarace proměnné tabulky typů
Následující příklad vytvoří proměnnou table , která ukládá hodnoty zadané v OUTPUT klauzuli UPDATE příkazu. Následují dva SELECT příkazy, které vrátí hodnoty v @MyTableVar tabulce a výsledky operace aktualizace.Employee Výsledky ve INSERTED.ModifiedDate sloupci se liší od hodnot ve ModifiedDate sloupci Employee v tabulce. Důvodem je to, že AFTER UPDATE trigger, který aktualizuje hodnotu aktuálního ModifiedDate data, je definován v Employee tabulce. Sloupce vrácené z OUTPUT však odrážejí data před aktivací triggerů. Další informace naleznete v tématu VÝSTUPNÍ klauzule.
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. Deklarace proměnné tabulky typů s vloženými indexy
Následující příklad vytvoří proměnnou table s clusterovaným vloženým indexem a dvěma neclusterovanými vloženými indexy.
DECLARE @MyTableVar TABLE (
EmpID INT NOT NULL,
PRIMARY KEY CLUSTERED (EmpID),
UNIQUE NONCLUSTERED (EmpID),
INDEX CustomNonClusteredIndex NONCLUSTERED (EmpID));
GO
Následující dotaz vrátí informace o indexech vytvořených v předchozím dotazu.
SELECT * FROM tempdb.sys.indexes
WHERE object_id < 0;
GO
E. Deklarace proměnné uživatelem definovaného typu tabulky
Následující příklad vytvoří parametr s hodnotou tabulky nebo proměnnou tabulky s názvem @LocationTVP. Tento krok vyžaduje odpovídající uživatelem definovaný typ tabulky s názvem LocationTableType.
Další informace o vytvoření uživatelem definovaného typu tabulky naleznete v tématu CREATE TYPE. Další informace o parametrech s hodnotami tabulky naleznete v tématu
DECLARE @LocationTVP AS LocationTableType;
Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)
F. Použití DEKLARACE
Následující příklad používá místní proměnnou pojmenovanou @find k načtení kontaktních informací pro všechna rodinná jména začínající na 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. Použití DEKLARACÍ se dvěma proměnnými
Následující příklad načte pomocí proměnných k určení křestního jména a rodinného jména zaměstnanců v DimEmployee tabulce.
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;
Související obsah
- EXECUTE (Transact-SQL)
- Jaké jsou funkce databáze SQL?
- SELECT (Transact-SQL)
- Tabulka (Transact-SQL)
- Porovnání typed XML to untyped XML