Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Punkt końcowy analizy SQL w usłudze Microsoft Fabric
Magazyn w usłudze Microsoft Fabric
Baza danych SQL w usłudze Microsoft Fabric (wersja zapoznawcza)
Zmienne są deklarowane w treści partii lub procedury z instrukcją DECLARE i są przypisywane wartości przy użyciu instrukcji SET lub SELECT. Zmienne kursora można zadeklarować za pomocą tej instrukcji i używać z innymi instrukcjami powiązanymi z kursorem. Po deklaracji wszystkie zmienne są inicjowane jako NULL, chyba że wartość jest podana jako część deklaracji.
Transact-SQL konwencje składni
Syntax
Następująca składnia dotyczy programów SQL Server i Azure SQL Database:
DECLARE
{
{ @local_variable [AS] data_type [ = value ] }
| { @cursor_variable_name CURSOR }
} [ ,...n ]
| { @table_variable_name [AS] <table_type_definition> }
<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 ] ) ] ]
}
Następująca składnia dotyczy usług Azure Synapse Analytics i Parallel Data Warehouse i Microsoft Fabric:
DECLARE
{ { @local_variable [AS] data_type } [ = value [ COLLATE <collation_name> ] ] } [ ,...n ]
Arguments
@ local_variable
Nazwa zmiennej. Nazwy zmiennych muszą zaczynać się od znaku at (@). Nazwy zmiennych lokalnych muszą być zgodne z regułami dotyczącymi identyfikatorów.
data_type
Dowolny typ tabeli zdefiniowany przez użytkownika w środowisku uruchomieniowym języka wspólnego (CLR) dostarczany przez system lub typ danych aliasu. Zmienna nie może być typu danych tekstowych, ntekstowych ani obrazów .
Aby uzyskać więcej informacji na temat typów danych systemowych, zobacz Typy danych (Transact-SQL). Aby uzyskać więcej informacji o typach zdefiniowanych przez użytkownika lub typach danych aliasu CLR, zobacz CREATE TYPE (Transact-SQL).
=
value
Przypisuje wartość do zmiennej w wierszu. Wartość może być stałą lub wyrażeniem, ale musi być zgodna z typem deklaracji zmiennej lub niejawnie konwertowana na ten typ. Aby uzyskać więcej informacji, zobacz Expressions (Transact-SQL).
@ cursor_variable_name
Nazwa zmiennej kursora. Nazwy zmiennych kursora muszą zaczynać się od znaku (@) i być zgodne z regułami dotyczącymi identyfikatorów.
CURSOR
Określa, że zmienna jest lokalną zmienną kursora.
@
table_variable_name
Nazwa zmiennej typu tabela. Nazwy zmiennych muszą zaczynać się od znaku (@) i być zgodne z regułami dla identyfikatorów.
<table_type_definition>
Definiuje typ danych tabeli . Deklaracja tabeli zawiera definicje kolumn, nazwy, typy danych i ograniczenia. Jedynymi dozwolonymi typami ograniczeń są KLUCZ PODSTAWOWY, UNIKATOWY, NULL i CHECK. Typ danych aliasu nie może być używany jako typ danych skalarnych kolumn, jeśli reguła lub definicja domyślna jest powiązana z typem.
<table_type_definition>
Podzbiór informacji używany do definiowania tabeli w tabeli CREATE TABLE. Elementy i podstawowe definicje znajdują się tutaj. Aby uzyskać więcej informacji, zobacz CREATE TABLE (Transact-SQL).
n
Symbol zastępczy wskazujący, że można określić i przypisać wartości wielu zmiennych. Podczas deklarowania zmiennych tabeli zmienna tabeli musi być jedyną zmienną zadeklarowaną w instrukcji DECLARE.
column_name
Nazwa kolumny w tabeli.
scalar_data_type
Określa, że kolumna jest typem danych skalarnych.
computed_column_expression
Wyrażenie definiujące wartość obliczonej kolumny. Jest on obliczany na podstawie wyrażenia przy użyciu innych kolumn w tej samej tabeli. Na przykład kolumna obliczona może mieć wartość kosztu AS definicji * ilość. Wyrażenie może być niekompilowaną nazwą kolumny, stałą, wbudowaną funkcją, zmienną lub dowolną kombinacją tych połączonych przez co najmniej jeden operator. Wyrażenie nie może być podzapytaniem ani funkcją zdefiniowaną przez użytkownika. Wyrażenie nie może odwoływać się do typu zdefiniowanego przez użytkownika CLR.
[ COLLATE collation_name ]
Określa sortowanie dla kolumny. collation_name może być nazwą sortowania systemu Windows lub nazwą sortowania SQL i ma zastosowanie tylko dla kolumn char, varchar, text, nchar, nvarchar i ntext danych. Jeśli nie zostanie określony, kolumna zostanie przypisana do sortowania typu danych zdefiniowanego przez użytkownika (jeśli kolumna jest typu danych zdefiniowanym przez użytkownika) lub sortowania bieżącej bazy danych.
Aby uzyskać więcej informacji na temat nazw sortowania systemu Windows i SQL, zobacz COLLATE (Transact-SQL).
DEFAULT
Określa wartość podaną dla kolumny, gdy wartość nie jest jawnie podana podczas wstawiania. Definicje DOMYŚLNE można stosować do dowolnych kolumn, z wyjątkiem tych zdefiniowanych jako znacznik czasu lub tych z właściwością IDENTITY. Definicje DOMYŚLNE są usuwane, gdy tabela zostanie porzucona. Tylko stała wartość, taka jak ciąg znaków; funkcja systemowa, taka jak SYSTEM_USER(); wartość null może być używana jako wartość domyślna. Aby zachować zgodność z wcześniejszymi wersjami programu SQL Server, do domyślnej nazwy ograniczenia można przypisać nazwę ograniczenia.
constant_expression
Stała, NULL lub funkcja systemowa używana jako wartość domyślna kolumny.
IDENTITY
Wskazuje, że nowa kolumna jest kolumną tożsamości. Po dodaniu nowego wiersza do tabeli program SQL Server udostępnia unikatową wartość przyrostową dla kolumny. Kolumny tożsamości są często używane z ograniczeniami KLUCZA PODSTAWOWEgo, aby służyć jako unikatowy identyfikator wiersza dla tabeli. Właściwość IDENTITY można przypisać do kolumn tinyint, smallint, int, decimal(p,0) lub numerycznych(p,0). Dla tabeli można utworzyć tylko jedną kolumnę tożsamości. Nie można używać powiązanych wartości domyślnych i ograniczeń DOMYŚLNYch z kolumną tożsamości. Należy określić zarówno nasion, jak i przyrost, lub nie. Jeśli żadna z nich nie zostanie określona, wartość domyślna to (1,1).
seed
Wartość użyta dla pierwszego wiersza załadowanego do tabeli.
increment
Wartość przyrostowa dodana do wartości tożsamości poprzedniego wiersza, który został załadowany.
ROWGUIDCOL
Wskazuje, że nowa kolumna jest globalną kolumną unikatowego identyfikatora wiersza. Jako kolumnę ROWGUIDCOL można wyznaczyć tylko jedną unikatową kolumnę na tabelę. Właściwość ROWGUIDCOL można przypisać tylko do kolumny uniqueidentifier .
NULL | NIE NULL
Wskazuje, czy wartość null jest dozwolona w zmiennej. Wartość domyślna to NULL.
PRIMARY KEY
Ograniczenie wymuszające integralność jednostki dla danej kolumny lub kolumn za pośrednictwem unikatowego indeksu. Dla tabeli można utworzyć tylko jedno ograniczenie klucza podstawowego.
UNIQUE
Ograniczenie zapewniające integralność jednostki dla danej kolumny lub kolumn za pośrednictwem unikatowego indeksu. Tabela może mieć wiele unikatowych ograniczeń.
KLASTROWANE | NIEKLASTROWANE
Wskazuje, że indeks klastrowany lub nieklastrowany jest tworzony dla klucza PODSTAWOWEgo lub unikatowego ograniczenia. Ograniczenia KLUCZA PODSTAWOWEgo korzystają z klastra, a OGRANICZENIA UNIKATOWE używają WARTOŚCI NONCLUSTERED.
KLASTERED można określić tylko dla jednego ograniczenia. Jeśli określono parametr CLUSTERED dla ograniczenia UNIKATOWEGO, a ograniczenie KLUCZA PODSTAWOWEgo jest również określone, KLUCZ PODSTAWOWY używa WARTOŚCI NONCLUSTERED.
CHECK
Ograniczenie wymuszające integralność domeny przez ograniczenie możliwych wartości, które można wprowadzić w kolumnie lub kolumnach.
logical_expression
Wyrażenie logiczne zwracające wartość TRUE lub FALSE.
<index_option>
Określa co najmniej jedną opcję indeksu. Nie można jawnie tworzyć indeksów w zmiennych tabeli, a żadne statystyki nie są przechowywane w zmiennych tabeli. Począwszy od programu SQL SQL Server 2014 (12.x), wprowadzono nową składnię, która umożliwia tworzenie określonych typów indeksów w tekście przy użyciu definicji tabeli. Korzystając z tej nowej składni, można utworzyć indeksy zmiennych tabeli w ramach definicji tabeli. W niektórych przypadkach wydajność może poprawić się przy użyciu tabel tymczasowych, które zapewniają pełną obsługę indeksów i statystyki.
Pełny opis tych opcji można znaleźć w temacie CREATE TABLE (TWORZENIE TABELI).
Zmienne tabeli i szacunki wierszy
Zmienne tabeli nie mają statystyk dystrybucji. W wielu przypadkach optymalizator utworzy plan zapytania przy założeniu, że zmienna tabeli ma zero wierszy lub jeden wiersz. Aby uzyskać więcej informacji, przejrzyj typ danych tabeli — ograniczenia i ograniczenia.
Z tego powodu należy zachować ostrożność przy użyciu zmiennej tabeli, jeśli spodziewasz się większej liczby wierszy (więcej niż 100). Rozważ następujące alternatywy:
- Tabele tymczasowe mogą być lepszym rozwiązaniem niż zmienne tabeli, gdy istnieje możliwość, aby wiersz był większy (większy niż 100).
- W przypadku zapytań, które łączą zmienną tabeli z innymi tabelami, użyj wskazówki RECOMPILE, co spowoduje, że optymalizator będzie używać poprawnej kardynalności dla zmiennej tabeli.
- W usłudze Azure SQL Database i począwszy od programu SQL Server 2019 (15.x) funkcja kompilacji odroczonej zmiennej tabeli będzie propagować oszacowania kardynalności oparte na rzeczywistych liczbach wierszy zmiennych tabeli, zapewniając dokładniejszą liczbę wierszy do optymalizacji planu wykonania. Aby uzyskać więcej informacji, zobacz Inteligentne przetwarzanie zapytań w bazach danych SQL.
Remarks
Zmienne są często używane w partii lub procedurze jako liczniki while, LOOP lub IF... Blok ELSE.
Zmienne mogą być używane tylko w wyrażeniach, a nie zamiast nazw obiektów lub słów kluczowych. Aby utworzyć dynamiczne instrukcje SQL, użyj polecenia EXECUTE.
Zakres zmiennej lokalnej to partia, w której jest zadeklarowana.
Zmienna tabeli nie musi być rezydentem pamięci. Pod ciśnieniem pamięci strony należące do zmiennej tabeli można wypchnąć do tempdb
.
Indeks wbudowany można zdefiniować w zmiennej tabeli.
Zmienna kursora, która obecnie ma przypisany kursor, można odwoływać się jako źródło w:
- CLOSE statement
- DEALLOCATE statement
- FETCH statement
- OPEN statement
- Instrukcja POSITIONED DELETE lub UPDATE
- SET CURSOR, instrukcja zmiennej (po prawej stronie)
We wszystkich tych instrukcjach program SQL Server zgłasza błąd, jeśli istnieje zmienna kursora, do których występuje odwołanie, ale nie ma aktualnie przydzielonego kursora. Jeśli przywoływany zmienna kursora nie istnieje, program SQL Server zgłasza ten sam błąd zgłoszony dla zmiennej niezadeklarowanej innego typu.
Zmienna kursora:
Może być obiektem docelowym typu kursora lub innej zmiennej kursora. Aby uzyskać więcej informacji, zobacz SET @local_variable (Transact-SQL).
Można odwoływać się jako element docelowy parametru kursora wyjściowego w instrukcji EXECUTE, jeśli zmienna kursora nie ma aktualnie przypisanego kursora.
Należy traktować jako wskaźnik do kursora.
Examples
A. Using DECLARE
W poniższym przykładzie użyto zmiennej lokalnej o nazwie @find
, aby pobrać informacje kontaktowe dla wszystkich nazwisk rozpoczynających się od Man
.
USE AdventureWorks2022;
GO
DECLARE @find VARCHAR(30);
/* Also allowed:
DECLARE @find VARCHAR(30) = 'Man%';
*/
SET @find = 'Man%';
SELECT p.LastName, p.FirstName, ph.PhoneNumber
FROM Person.Person AS p
JOIN Person.PersonPhone AS ph ON p.BusinessEntityID = ph.BusinessEntityID
WHERE LastName LIKE @find;
Oto zestaw wyników.
LastName FirstName Phone
------------------- ----------------------- -------------------------
Manchepalli Ajay 1 (11) 500 555-0174
Manek Parul 1 (11) 500 555-0146
Manzanares Tomas 1 (11) 500 555-0178
(3 row(s) affected)
B. Używanie funkcji DECLARE z dwiema zmiennymi
Poniższy przykład pobiera nazwy przedstawicieli sprzedaży Adventure Works Cycles, którzy znajdują się na terytorium sprzedaży w Ameryce Północnej i mają co najmniej 2000 000 USD sprzedaży w ciągu roku.
USE AdventureWorks2022;
GO
SET NOCOUNT ON;
GO
DECLARE @Group nvarchar(50), @Sales 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. Deklarowanie zmiennej typu tabeli
Poniższy przykład tworzy zmienną table
, która przechowuje wartości określone w klauzuli OUTPUT instrukcji UPDATE. Dwa SELECT
instrukcje są zgodne z instrukcjami, które zwracają wartości w @MyTableVar
tabeli i wyniki operacji aktualizacji.Employee
Wyniki w INSERTED.ModifiedDate
kolumnie różnią się od wartości w ModifiedDate
kolumnie Employee
w tabeli. Dzieje się tak, ponieważ AFTER UPDATE
wyzwalacz, który aktualizuje wartość ModifiedDate
bieżącej daty, jest zdefiniowany w Employee
tabeli. Jednak kolumny zwrócone z OUTPUT
odzwierciedlają dane przed wyzwoleniem wyzwalaczy. Aby uzyskać więcej informacji, zobacz OUTPUT Clause (Transact-SQL).
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. Deklarowanie zmiennej typu tabeli z wbudowanymi indeksami
W poniższym przykładzie tworzona jest zmienna table
z indeksem wbudowanym klastra i dwoma indeksami wbudowanymi, które nie są klasterowane.
DECLARE @MyTableVar TABLE (
EmpID INT NOT NULL,
PRIMARY KEY CLUSTERED (EmpID),
UNIQUE NONCLUSTERED (EmpID),
INDEX CustomNonClusteredIndex NONCLUSTERED (EmpID)
);
GO
Poniższe zapytanie zwraca informacje o indeksach utworzonych w poprzednim zapytaniu.
SELECT *
FROM tempdb.sys.indexes
WHERE object_id < 0;
GO
E. Deklarowanie zmiennej typu tabeli zdefiniowanej przez użytkownika
W poniższym przykładzie jest tworzony parametr wartości tabeli lub zmienna tabeli o nazwie @LocationTVP
. Wymaga to odpowiedniego typu tabeli zdefiniowanej przez użytkownika o nazwie LocationTableType
. Aby uzyskać więcej informacji na temat tworzenia typu tabeli zdefiniowanej przez użytkownika, zobacz CREATE TYPE (Transact-SQL). Aby uzyskać więcej informacji na temat parametrów wartości tabeli, zobacz Używanie parametrów Table-Valued (aparat bazy danych).
DECLARE @LocationTVP
AS LocationTableType;
Przykłady: Azure Synapse Analytics and Analytics Platform System (PDW)
F. Using DECLARE
W poniższym przykładzie użyto zmiennej lokalnej o nazwie @find
, aby pobrać informacje kontaktowe dla wszystkich nazwisk rozpoczynających się od Walt
.
-- Uses AdventureWorks
DECLARE @find VARCHAR(30);
/* Also allowed:
DECLARE @find VARCHAR(30) = 'Man%';
*/
SET @find = 'Walt%';
SELECT LastName, FirstName, Phone
FROM DimEmployee
WHERE LastName LIKE @find;
G. Używanie funkcji DECLARE z dwiema zmiennymi
Poniższy przykład pobiera zmienne, aby określić imię i nazwisko pracowników w DimEmployee
tabeli.
-- Uses AdventureWorks
DECLARE @lastName VARCHAR(30), @firstName VARCHAR(30);
SET @lastName = 'Walt%';
SET @firstName = 'Bryan';
SELECT LastName, FirstName, Phone
FROM DimEmployee
WHERE LastName LIKE @lastName AND FirstName LIKE @firstName;