DECLARE @local_variable (Transact-SQL)

Переменные объявляются в теле пакета или процедуры при помощи инструкции DECLARE, а значения им присваиваются при помощи инструкций SET или SELECT. При помощи этой инструкции можно объявлять переменные курсоров для использования в других инструкциях. После декларации все переменные инициализируются значением NULL, если иное значение не предоставляется как часть декларации.

Применимо для следующих объектов: SQL Server (SQL Server 2008 по текущую версию), База данных SQL Azure (С первоначального выпуска по текущий выпуск).

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

Синтаксис

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> } [ ,... ] ) 

<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 [ ,... ] ) 
     | CHECK ( search_condition ) 
     } 

<index_option> ::=
See CREATE TABLE for index option syntax.

Аргументы

  • @local\_variable
    Имя переменной. Имена переменных должны начинаться с символа (@). Имена локальных переменных должны соответствовать правилам для идентификаторов.

  • data_type
    Любой системный тип данных, определяемый пользователем табличный тип среды CLR или псевдоним типа данных. Переменная не может принадлежать к типу данных text, ntext или image.

    Дополнительные сведения о системных типах данных см. в разделе Типы данных (Transact-SQL). Дополнительные сведения об определяемых пользователем типах данных CLR или о псевдонимах типов данных см. в разделе CREATE TYPE (Transact-SQL).

  • =value
    Подставляет значение переменной. Значение может быть константой или выражением, но должно совпадать с объявленным типом переменной или явно преобразовываться в этот тип. Дополнительные сведения см. в разделе Выражения (Transact-SQL).

  • @cursor\_variable\_name
    Имя переменной курсора. Имена переменных курсора должны начинаться с символа (@) и должны соответствовать правилам именования идентификаторов.

  • CURSOR
    Указывает, что переменная является локальной переменной курсора.

  • @table\_variable\_name
    Имя переменной типа table. Имена переменных должны начинаться с символа (@) и соответствовать правилам именования идентификаторов.

  • <table_type_definition>
    Определяет тип данных table. Декларация таблицы включает определения столбцов, имен, типов данных и ограничений. Допустимы только ограничения PRIMARY KEY, UNIQUE, NULL и CHECK. Псевдоним типа данных не может использоваться как скалярный тип данных столбца, если к этому столбцу привязано правило или значение по умолчанию.

    Аргумент <table_type_definition> представляет собой подмножество данных, используемых для определения таблицы в инструкции CREATE TABLE. Сюда включены элементы и наиболее существенные определения. Дополнительные сведения см. в разделе CREATE TABLE (SQL Server).

  • n
    Заполнитель, указывающий на то, что могут быть заданы несколько переменных и им могут быть присвоены значения. При объявлении переменных типа table в инструкции DECLARE единственной объявляемой переменной должна быть переменная типа table.

  • column_name
    Имя столбца таблицы.

  • scalar_data_type
    Указывает, что столбец имеет скалярный тип данных.

  • computed_column_expression
    Выражение, определяющее значение вычисляемого столбца. Значение вычисляется из выражения при помощи других столбцов той же таблицы. Например, вычисляемый столбец может иметь определение cost AS price * qty. Выражение может быть именем невычисляемого столбца, константой, встроенной функцией, переменной или любым их сочетанием, созданным с помощью одного или нескольких операторов. Выражение не может быть вложенным запросом или определяемой пользователем функцией. Выражение не может ссылаться на определяемый пользователем тип данных CLR.

  • [ COLLATE collation_name]
    Задает параметры сортировки для столбца. Аргумент collation_name может быть именем параметров сортировки Windows или SQL, он применим только к столбцам типов данных char, varchar, text, nchar, nvarchar и ntext. Если этот аргумент не указан, столбцу назначаются либо параметры сортировки определяемого пользователем типа данных (если столбец принадлежит к определяемому пользователем типу данных), либо параметры сортировки текущей базы данных.

    Список имен параметров сортировки Windows и SQL см. в разделе COLLATE (Transact-SQL).

  • DEFAULT
    Указывает значение, присваиваемое столбцу в случае отсутствия явно заданного значения при вставке. Определения DEFAULT могут применяться к любым столбцам, кроме имеющих тип timestamp или обладающих свойством IDENTITY. Определения DEFAULT удаляются, когда таблица удаляется из памяти. По умолчанию могут использоваться только константные значения, например символьные строки, системные функции, например SYSTEM_USER(), или NULL. Для сохранения совместимости с более ранними версиями сервера SQL Server значению DEFAULT может быть присвоено имя ограничения.

  • constant_expression
    Константа, NULL или системная функция, используемые в качестве значения по умолчанию для столбца.

  • IDENTITY
    Указывает, что новый столбец является столбцом идентификаторов. При добавлении в таблицу новой строки SQL Server формирует для столбца уникальное, последовательное значение. Столбцы идентификаторов наиболее часто используются в сочетании с ограничениями PRIMARY KEY для выполнения функции уникального идентификатора строки таблицы. Свойство IDENTITY может быть присвоено столбцам, имеющим типы tinyint, smallint, int, decimal(p,0) и numeric(p,0). Для каждой таблицы можно создать только один столбец идентификаторов. Ограниченные значения по умолчанию и ограничения DEFAULT не могут использоваться в столбце идентификаторов. Необходимо указывать либо оба значения seed и increment, либо ни тот, ни другой. Если ничего не указано, применяется значение по умолчанию (1,1).

  • seed
    Значение, используемое для самой первой строки, загружаемой в таблицу.

  • increment
    Значение, добавляемое к значению идентификатора предыдущей загруженной строки.

  • ROWGUIDCOL
    Указывает, что новый столбец является столбцом глобального уникального идентификатора строки. Только один столбец типа uniqueidentifier в таблице может быть назначен в качестве столбца ROWGUIDCOL. Свойство ROWGUIDCOL может быть присвоено только столбцу типа uniqueidentifier.

  • NULL | NOT NULL
    Указывает, является ли значение null допустимым в переменной. Значение по умолчанию: NULL.

  • PRIMARY KEY
    Ограничение, которое с помощью уникального индекса требует целостности сущностей для данного столбца или столбцов. Можно создать только одно ограничение PRIMARY KEY для таблицы.

  • UNIQUE
    Ограничение, которое с помощью уникального индекса обеспечивает целостность сущностей для данного столбца или столбцов. В таблице может быть несколько ограничений UNIQUE.

  • CHECK
    Ограничение, обеспечивающее целостность домена путем ограничения возможных значений, которые могут быть введены в столбец или столбцы.

  • logical_expression
    Логическое выражение, возвращающее значения TRUE или FALSE.

Замечания

Переменные часто используются в пакете или процедуре в качестве счетчиков для циклов WHILE, LOOP или в блоке IF…ELSE.

Переменные могут использоваться только в выражениях, но не вместо имен объектов или ключевых слов. Для построения динамических инструкций SQL используйте EXECUTE.

Областью локальной переменной является пакет, в котором она объявлена.

На переменную курсора, которая в настоящее время содержит назначенный ей курсор, можно ссылаться в качестве источника из:

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

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

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

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

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

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

Во всех этих инструкциях SQL Server формирует ошибку, если переменная курсора, на которую они ссылаются, существует, но не содержит курсор, назначенный ей в настоящее время. Если переменная курсора, на которую производится ссылка, не существует, сервер SQL Server формирует ту же ошибку, что и для необъявленной переменной другого типа.

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

  • Может быть целью типа курсора или другой переменной курсора. Дополнительные сведения см. в разделе SET @local\_variable (Transact-SQL).

  • Может быть объектом ссылки в качестве цели выходного параметра курсора в инструкции EXECUTE, если эта переменная не содержит курсора, назначенного ей в настоящее время.

  • Должна рассматриваться в качестве указателя на курсор.

Примеры

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

В следующем примере локальная переменная с именем @find используется для получения контактных данных для лиц с фамилией, начинающейся на 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; 

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

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)

Б.Использование инструкции DECLARE с двумя переменными

В следующем примере возвращаются имена коммерческих представителей компании Компания Adventure Works Cycles, находящихся в Северной Америке и имеющих объемы продаж на сумму не менее 2 000 000 долларов в год.

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;

В.Объявление переменной типа table

В следующем примере создается переменная типа table, в которой хранятся значения, задаваемые в предложении OUTPUT инструкции UPDATE. Две следующие инструкции SELECT возвращают значения в табличную переменную @MyTableVar, а результаты операции обновления — в таблицу Employee. Заметьте, что результаты в столбце INSERTED.ModifiedDate отличны от значений в столбце ModifiedDate таблицы Employee . Это связано с тем, что для таблицы Employee определен триггер AFTER UPDATE, обновляющий значение ModifiedDate до текущей даты. Однако столбцы, возвращенные из OUTPUT, отражают состояние данных перед срабатыванием триггеров. Дополнительные сведения см. в разделе Предложение OUTPUT (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

Г.Объявление переменной определяемого пользователем табличного типа

Следующий пример демонстрирует создание параметра, возвращающего табличное значение, или табличной переменной с именем @LocationTVP. Здесь требуется соответствующий определяемый пользователем табличный тип с именем LocationTableType. Дополнительные сведения о создании определяемого пользователем табличного типа см. в разделе CREATE TYPE (Transact-SQL). Дополнительные сведения о возвращающих табличное значение параметрах см. в разделе Использование параметров, возвращающих табличные значения (компонент Database Engine).

DECLARE @LocationTVP 
AS LocationTableType;

См. также

Справочник

EXECUTE (Transact-SQL)

Встроенные функции (Transact-SQL)

SELECT (Transact-SQL)

table (Transact-SQL)

Основные понятия

Сравнение типизированного и нетипизированного XML