DECLARE (Transact-SQL)DECLARE (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure даAzure Synapse Analytics (хранилище данных SQL) даParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Переменные объявляются в теле пакета или процедуры при помощи инструкции DECLARE, а значения им присваиваются при помощи инструкций SET или SELECT.Variables are declared in the body of a batch or procedure with the DECLARE statement and are assigned values by using either a SET or SELECT statement. При помощи этой инструкции можно объявлять переменные курсоров для использования в других инструкциях.Cursor variables can be declared with this statement and used with other cursor-related statements. После декларации все переменные инициализируются значением NULL, если иное значение не предоставляется как часть декларации.After declaration, all variables are initialized as NULL, unless a value is provided as part of the declaration.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

-- Syntax for SQL Server and 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> } [ ,...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_constraint> ::=   
     { [ NULL | NOT NULL ]   
     | [ PRIMARY KEY | UNIQUE ]   
     | CHECK ( logical_expression )   
     | WITH ( <index_option > )  
     }   
  
<table_constraint> ::=   
     { { PRIMARY KEY | UNIQUE } ( column_name [ ,...n] )   
     | CHECK ( search_condition )   
     }   
  
<index_option> ::=  
See CREATE TABLE for index option syntax.  
  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
  
DECLARE   
{{ @local_variable [AS] data_type } [ =value [ COLLATE <collation_name> ] ] } [,...n]  
  

АргументыArguments

@local_variable@local_variable
Имя переменной.Is the name of a variable. Имена переменных должны начинаться с символа @.Variable names must begin with an at (@) sign. Имена локальных переменных должны соответствовать правилам для идентификаторов.Local variable names must comply with the rules for identifiers.

data_typedata_type
Любой системный тип данных, определяемый пользователем табличный тип среды CLR или псевдоним типа данных.Is any system-supplied, common language runtime (CLR) user-defined table type, or alias data type. Переменная не может иметь тип text, ntext или image.A variable cannot be of text, ntext, or image data type.

Дополнительные сведения о типах данных в системе см. в разделе Типы данных (Transact-SQL).For more information about system data types, see Data Types (Transact-SQL). Дополнительные сведения об определяемых пользователем типах данных CLR или о псевдонимах типов данных см. в разделе CREATE TYPE(Transact-SQL).For more information about CLR user-defined types or alias data types, see CREATE TYPE (Transact-SQL).

=value=value
Подставляет значение переменной.Assigns a value to the variable in-line. Значение может быть константой или выражением, но должно совпадать с объявленным типом переменной или явно преобразовываться в этот тип.The value can be a constant or an expression, but it must either match the variable declaration type or be implicitly convertible to that type. Дополнительные сведения см. в разделе Выражения (Transact-SQL).For more information, see Expressions (Transact-SQL).

@cursor_variable_name@cursor_variable_name
Имя переменной курсора.Is the name of a cursor variable. Имена переменных курсора должны начинаться с символа @ и должны соответствовать правилам именования идентификаторов.Cursor variable names must begin with an at (@) sign and conform to the rules for identifiers.

CURSORCURSOR
Указывает, что переменная является локальной переменной курсора.Specifies that the variable is a local cursor variable.

@table_variable_name@table_variable_name
Имя переменной типа table.Is the name of a variable of type table. Имена переменных должны начинаться с символа @ и соответствовать правилам именования идентификаторов.Variable names must begin with an at (@) sign and conform to the rules for identifiers.

<table_type_definition><table_type_definition>
Определяет тип данных table.Defines the table data type. Декларация таблицы включает определения столбцов, имен, типов данных и ограничений.The table declaration includes column definitions, names, data types, and constraints. Допустимы только ограничения PRIMARY KEY, UNIQUE, NULL и CHECK.The only constraint types allowed are PRIMARY KEY, UNIQUE, NULL, and CHECK. Псевдоним типа данных не может использоваться как скалярный тип данных столбца, если к этому столбцу привязано правило или значение по умолчанию.An alias data type cannot be used as a column scalar data type if a rule or default definition is bound to the type.

Аргумент <table_type_definition> представляет собой подмножество данных, используемых для определения таблицы в инструкции CREATE TABLE.<table_type_definiton> Is a subset of information used to define a table in CREATE TABLE. Сюда включены элементы и наиболее существенные определения.Elements and essential definitions are included here. Дополнительные сведения см. в разделе CREATE TABLE (Transact-SQL).For more information, see CREATE TABLE (Transact-SQL).

nn
Заполнитель, указывающий на то, что могут быть заданы несколько переменных и им могут быть присвоены значения.Is a placeholder indicating that multiple variables can be specified and assigned values. При объявлении переменных типа table в инструкции DECLARE единственной объявляемой переменной должна быть переменная типа table.When declaring table variables, the table variable must be the only variable being declared in the DECLARE statement.

column_namecolumn_name
Имя столбца таблицы.Is the name of the column in the table.

scalar_data_typescalar_data_type
Указывает, что столбец имеет скалярный тип данных.Specifies that the column is a scalar data type.

computed_column_expressioncomputed_column_expression
Выражение, определяющее значение вычисляемого столбца.Is an expression defining the value of a computed column. Значение вычисляется из выражения при помощи других столбцов той же таблицы.It is computed from an expression using other columns in the same table. Например, вычисляемый столбец может иметь определение cost AS price * qty. Выражение может быть именем невычисляемого столбца, константой, встроенной функцией, переменной или любым их сочетанием, созданным с помощью одного или нескольких операторов.For example, a computed column can have the definition cost AS price * qty. The expression can be a noncomputed column name, constant, built-in function, variable, or any combination of these connected by one or more operators. Выражение не может быть вложенным запросом или определяемой пользователем функцией.The expression cannot be a subquery or a user-defined function. Выражение не может ссылаться на определяемый пользователем тип данных CLR.The expression cannot reference a CLR user-defined type.

[ COLLATE collation_name][ COLLATE collation_name]
Задает параметры сортировки для столбца.Specifies the collation for the column. Аргумент collation_name может быть либо именем параметров сортировки Windows, либо именем параметров сортировки SQL и применим только к столбцам типа char, varchar, text, nchar, nvarchar и ntext.collation_name can be either a Windows collation name or an SQL collation name, and is applicable only for columns of the char, varchar, text, nchar, nvarchar, and ntext data types. Если этот аргумент не указан, столбцу назначаются либо параметры сортировки определяемого пользователем типа данных (если столбец принадлежит к определяемому пользователем типу данных), либо параметры сортировки текущей базы данных.If not specified, the column is assigned either the collation of the user-defined data type (if the column is of a user-defined data type) or the collation of the current database.

Дополнительные сведения об именах параметров сортировки Windows и SQL см. в разделе COLLATE (Transact-SQL).For more information about the Windows and SQL collation names, see COLLATE (Transact-SQL).

DEFAULTDEFAULT
Указывает значение, присваиваемое столбцу в случае отсутствия явно заданного значения при вставке.Specifies the value provided for the column when a value is not explicitly supplied during an insert. Определения DEFAULT могут применяться к любым столбцам, кроме имеющих тип timestamp или обладающих свойством IDENTITY.DEFAULT definitions can be applied to any columns except those defined as timestamp or those with the IDENTITY property. Определения DEFAULT удаляются, когда таблица удаляется из памяти.DEFAULT definitions are removed when the table is dropped. По умолчанию могут использоваться только константные значения, например символьные строки, системные функции, например SYSTEM_USER(), или NULL.Only a constant value, such as a character string; a system function, such as a SYSTEM_USER(); or NULL can be used as a default. Для сохранения совместимости с более ранними версиями сервера SQL ServerSQL Server значению DEFAULT может быть присвоено имя ограничения.To maintain compatibility with earlier versions of SQL ServerSQL Server, a constraint name can be assigned to a DEFAULT.

constant_expressionconstant_expression
Константа, NULL или системная функция, используемые в качестве значения по умолчанию для столбца.Is a constant, NULL, or a system function used as the default value for the column.

IDENTITYIDENTITY
Указывает, что новый столбец является столбцом идентификаторов.Indicates that the new column is an identity column. При добавлении в таблицу новой строки SQL ServerSQL Server формирует для столбца уникальное, последовательное значение.When a new row is added to the table, SQL ServerSQL Server provides a unique incremental value for the column. Столбцы идентификаторов наиболее часто используются в сочетании с ограничениями PRIMARY KEY для выполнения функции уникального идентификатора строки таблицы.Identity columns are commonly used in conjunction with PRIMARY KEY constraints to serve as the unique row identifier for the table. Свойство IDENTITY может назначаться для столбцов типа tinyint, smallint, int, decimal(p,0) или numeric(p,0) .The IDENTITY property can be assigned to tinyint, smallint, int, decimal(p,0), or numeric(p,0) columns. Для каждой таблицы можно создать только один столбец идентификаторов.Only one identity column can be created per table. Ограниченные значения по умолчанию и ограничения DEFAULT не могут использоваться в столбце идентификаторов.Bound defaults and DEFAULT constraints cannot be used with an identity column. Необходимо указывать либо оба значения seed и increment, либо ни тот, ни другой.You must specify both the seed and increment, or neither. Если ничего не указано, применяется значение по умолчанию (1,1).If neither is specified, the default is (1,1).

seedseed
Значение, используемое для самой первой строки, загружаемой в таблицу.Is the value used for the very first row loaded into the table.

incrementincrement
Значение, добавляемое к значению идентификатора предыдущей загруженной строки.Is the incremental value added to the identity value of the previous row that was loaded.

ROWGUIDCOLROWGUIDCOL
Указывает, что новый столбец является столбцом глобального уникального идентификатора строки.Indicates that the new column is a row global unique identifier column. Только один столбец типа uniqueidentifier в таблице может быть назначен в качестве столбца ROWGUIDCOL.Only one uniqueidentifier column per table can be designated as the ROWGUIDCOL column. Свойство ROWGUIDCOL может быть присвоено только столбцу типа uniqueidentifier.The ROWGUIDCOL property can be assigned only to a uniqueidentifier column.

NULL | NOT NULLNULL | NOT NULL
Указывает, является ли значение null допустимым в переменной.Indicates if null is allowed in the variable. Значение по умолчанию — NULL.The default is NULL.

PRIMARY KEYPRIMARY KEY
Ограничение, которое с помощью уникального индекса требует целостности сущностей для данного столбца или столбцов.Is a constraint that enforces entity integrity for a given column or columns through a unique index. Можно создать только одно ограничение PRIMARY KEY для таблицы.Only one PRIMARY KEY constraint can be created per table.

UNIQUEUNIQUE
Ограничение, которое с помощью уникального индекса обеспечивает целостность сущностей для данного столбца или столбцов.Is a constraint that provides entity integrity for a given column or columns through a unique index. В таблице может быть несколько ограничений UNIQUE.A table can have multiple UNIQUE constraints.

CHECKCHECK
Ограничение, обеспечивающее целостность домена путем ограничения возможных значений, которые могут быть введены в столбец или столбцы.Is a constraint that enforces domain integrity by limiting the possible values that can be entered into a column or columns.

logical_expressionlogical_expression
Логическое выражение, возвращающее значения TRUE или FALSE.Is a logical expression that returns TRUE or FALSE.

RemarksRemarks

Переменные часто используются в пакете или процедуре в качестве счетчиков для циклов WHILE, LOOP или в блоке IF…ELSE.Variables are often used in a batch or procedure as counters for WHILE, LOOP, or for an IF...ELSE block.

Переменные могут использоваться только в выражениях, но не вместо имен объектов или ключевых слов.Variables can be used only in expressions, not in place of object names or keywords. Для построения динамических инструкций SQL используйте EXECUTE.To construct dynamic SQL statements, use EXECUTE.

Областью локальной переменной является пакет, в котором она объявлена.The scope of a local variable is the batch in which it is declared.

Табличная переменная необязательно является резидентной.A table variable is not necessarily memory resident. В случае нехватки памяти страницы, относящиеся к табличной переменной, можно перенести в базу данных tempdb.Under memory pressure, the pages belonging to a table variable can be pushed out to tempdb.

На переменную курсора, которая в настоящее время содержит назначенный ей курсор, можно ссылаться в качестве источника из:A cursor variable that currently has a cursor assigned to it can be referenced as a source in a:

  • инструкции CLOSE;CLOSE statement.

  • инструкции DEALLOCATE;DEALLOCATE statement.

  • инструкции FETCH;FETCH statement.

  • инструкции OPEN;OPEN statement.

  • позиционированных инструкций DELETE или UPDATE;Positioned DELETE or UPDATE statement.

  • инструкции SET CURSOR с использованием переменных (в правой части).SET CURSOR variable statement (on the right side).

Во всех этих инструкциях SQL ServerSQL Server формирует ошибку, если переменная курсора, на которую они ссылаются, существует, но не содержит курсор, назначенный ей в настоящее время.In all of these statements, SQL ServerSQL Server raises an error if a referenced cursor variable exists but does not have a cursor currently allocated to it. Если переменная курсора, на которую производится ссылка, не существует, сервер SQL ServerSQL Server формирует ту же ошибку, что и для необъявленной переменной другого типа.If a referenced cursor variable does not exist, SQL ServerSQL Server raises the same error raised for an undeclared variable of another type.

Переменная курсора:A cursor variable:

  • Может быть целью типа курсора или другой переменной курсора.Can be the target of either a cursor type or another cursor variable. Дополнительные сведения см. в разделе SET @local_variable (Transact-SQL).For more information, see SET @local_variable (Transact-SQL).

  • Может быть объектом ссылки в качестве цели выходного параметра курсора в инструкции EXECUTE, если эта переменная не содержит курсора, назначенного ей в настоящее время.Can be referenced as the target of an output cursor parameter in an EXECUTE statement if the cursor variable does not have a cursor currently assigned to it.

  • Должна рассматриваться в качестве указателя на курсор.Should be regarded as a pointer to the cursor.

ПримерыExamples

A.A. Использование инструкции DECLAREUsing DECLARE

В следующем примере локальная переменная с именем @find используется для получения контактных данных для лиц с фамилией, начинающейся на Man.The following example uses a local variable named @find to retrieve contact information for all last names beginning with Man.

USE AdventureWorks2012;  
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;  
  

Ниже приводится результирующий набор.Here is the result set.

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. Использование инструкции DECLARE с двумя переменнымиUsing DECLARE with two variables

В следующем примере возвращаются имена коммерческих представителей компании Компания Adventure Works CyclesAdventure Works Cycles, находящихся в Северной Америке и имеющих объемы продаж на сумму не менее 2 000 000 долларов в год.The following example retrieves the names of Компания Adventure Works CyclesAdventure Works Cycles sales representatives who are located in the North American sales territory and have at least $2,000,000 in sales for the year.

USE AdventureWorks2012;  
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. Объявление переменной типа tableDeclaring a variable of type table

В следующем примере создается переменная типа table, в которой хранятся значения, задаваемые в предложении OUTPUT инструкции UPDATE.The following example creates a table variable that stores the values specified in the OUTPUT clause of the UPDATE statement. Две следующие инструкции SELECT возвращают значения в табличную переменную @MyTableVar, а результаты операции обновления — в таблицу Employee.Two SELECT statements follow that return the values in @MyTableVar and the results of the update operation in the Employee table. Обратите внимание, что результаты в столбце INSERTED.ModifiedDate отличны от значений в столбце ModifiedDate таблицы Employee.Note that the results in the INSERTED.ModifiedDate column differ from the values in the ModifiedDate column in the Employee table. Это связано с тем, что для таблицы AFTER UPDATE определен триггер ModifiedDate, обновляющий значение Employee до текущей даты.This is because the AFTER UPDATE trigger, which updates the value of ModifiedDate to the current date, is defined on the Employee table. Однако столбцы, возвращенные из OUTPUT, отражают состояние данных перед срабатыванием триггеров.However, the columns returned from OUTPUT reflect the data before triggers are fired. Дополнительные сведения см. в статье Предложение OUTPUT (Transact-SQL).For more information, see OUTPUT Clause (Transact-SQL).

USE AdventureWorks2012;  
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. Объявление переменной определяемого пользователем табличного типаDeclaring a variable of user-defined table type

Следующий пример демонстрирует создание параметра, возвращающего табличное значение, или табличной переменной с именем @LocationTVP.The following example creates a table-valued parameter or table variable called @LocationTVP. Здесь требуется соответствующий определяемый пользователем табличный тип с именем LocationTableType.This requires a corresponding user-defined table type called LocationTableType. Дополнительные сведения о создании определяемого пользователем табличного типа см. в разделе CREATE TYPE (Transact-SQL).For more information about how to create a user-defined table type, see CREATE TYPE (Transact-SQL). Дополнительные сведения о возвращающих табличные значения параметрах см. в разделе Использование параметров, возвращающих табличные значения (ядро СУБД).For more information about table-valued parameters, see Use Table-Valued Parameters (Database Engine).

DECLARE @LocationTVP   
AS LocationTableType;  

Примеры: Azure Synapse Analytics (хранилище данных SQL)Azure Synapse Analytics (SQL DW) и Параллельное хранилище данныхParallel Data WarehouseExamples: Azure Synapse Analytics (хранилище данных SQL)Azure Synapse Analytics (SQL DW) and Параллельное хранилище данныхParallel Data Warehouse

Д.E. Использование инструкции DECLAREUsing DECLARE

В следующем примере локальная переменная с именем @find используется для получения контактных данных для лиц с фамилией, начинающейся на Walt.The following example uses a local variable named @find to retrieve contact information for all last names beginning with 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;  

Е.F. Использование инструкции DECLARE с двумя переменнымиUsing DECLARE with two variables

В следующем примере используются переменные для указания имен и фамилий сотрудников в таблице DimEmployee.The following example retrieves uses variables to specify the first and last names of employees in the DimEmployee table.

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

См. также:See Also

EXECUTE (Transact-SQL) EXECUTE (Transact-SQL)
Встроенные функции (Transact-SQL) Built-in Functions (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
table (Transact-SQL) table (Transact-SQL)
Сравнение типизированного и нетипизированного XMLCompare Typed XML to Untyped XML