SET @local_variable (Transact-SQL)
Устанавливает локальную переменную, предварительно созданную при помощи инструкции DECLARE **@**local_variable, в указанное значение.
Соглашения о синтаксисе в Transact-SQL
Синтаксис
SET
{ @local_variable
[:: property_name | field_name ] = expression | udt_name { . | :: } method_name(argument [ ,...n ] )
}
|
{ @cursor_variable =
{ @cursor_variable | cursor_name
| { CURSOR [ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]
}
}
}
Аргументы
- **@**local_variable
Имя переменной любого типа кроме cursor, text, ntext, image или table. Имена переменных должны начинаться с одного символа @. Имена переменных должны соответствовать правилам для идентификаторов.
- property_name
Свойство пользовательского типа.
- field_name
Общее поле пользовательского типа.
- udt_name
Имя пользовательского типа среды CLR.
- { . | :: }
Указывает метод пользовательского типа среды CLR. Для метода экземпляра (не статического) используйте точку (.). Для статического метода используйте два двоеточия (::). Для обращения к методу, свойству или полю пользовательского типа среды CLR необходимо разрешение EXECUTE для этого типа.
- method_name**(**argument [ ,... n ] )
Метод пользовательского типа, который принимает один или несколько аргументов для изменения состояния экземпляра типа. Статические методы должны быть публичными.
- expression
Любое допустимое выражение.
- cursor_variable
Имя переменной курсора. Если переменная целевого курсора ранее ссылалась на другой курсор, эта ссылка будет удалена.
- cursor_name
Имя курсора, объявленного при помощи инструкции DECLARE CURSOR.
- CURSOR
Указывает, что инструкция SET содержит объявление курсора.
- SCROLL
Указывает, что курсор поддерживает все аргументы выборки: FIRST, LAST, NEXT, PRIOR, RELATIVE и ABSOLUTE. Аргумент SCROLL не может быть задан, если задан аргумент FAST_FORWARD.
FORWARD_ONLY
Указывает, что курсор поддерживает только аргумент FETCH NEXT. Курсор может быть извлечен в одном направлении с первой до последней строки. Если аргумент FORWARD_ONLY задан без ключевых слов STATIC, KEYSET или DYNAMIC, создается курсор типа DYNAMIC. Если не указаны ни аргумент FORWARD_ONLY, ни аргумент SCROLL, по умолчанию используется аргумент FORWARD_ONLY, если нет ключевых слов STATIC, KEYSET или DYNAMIC. Для курсоров STATIC, KEYSET и DYNAMIC аргумент SCROLL добавляется по умолчанию.Примечание. В SQL Server 2000 аргументы курсора FAST_FORWARD и FORWARD_ONLY взаимно исключают друг друга. Если один из них задан, другой задавать нельзя, иначе возникнет ошибка. В SQL Server 2005 оба ключевых слова могут быть использованы в одной и той же инструкции DECLARE CURSOR.
- STATIC
Определяет курсор, который производит временную копию данных для своего использования. Ответы на все запросы к курсору даются из временной таблицы в tempdb, поэтому изменения основных таблиц не отражаются в возвращенных выборками этого курсора данными, и этот курсор не позволяет производить изменения.
KEYSET
Указывает, что членство или порядок строк в курсоре неизменны при его открытии. Набор ключей, который уникально определяет строки, встроенные в таблицу keyset в tempdb. Изменения на неключевые значения в базовых таблицах либо созданных владельцем курсора, либо зафиксированных другими пользователям, видны при прокрутке владельцем курсора содержимого курсора. Вставки, выполненные другими пользователями, не будут видны, и вставки не могут быть выполнены через курсор сервера Transact-SQL.Если удаляется строка, попытка выборки строк возвращает значение @@FETCH_STATUS, равное -2. Обновления ключевых значений снаружи извне курсора схожи с удалением старой строки с последующей вставкой новой строки. Строка с новым значением не видна и попытки выборки строки со старыми значениями возвращают значение @@FETCH_STATUS, равное -2. Новые значения видны, если обновление было выполнено через курсор посредством указания предложения WHERE CURRENT OF.
- DYNAMIC
Определяет курсор, который отражает все изменения данных в строках в его результирующем наборе по мере того, как владелец курсора осуществляет прокрутку по курсору. Значения данных, порядок, и членство строк в каждой выборке могут меняться. Параметры абсолютной и относительной выборки не поддерживаются динамическими курсорами.
FAST_FORWARD
Задает курсор типа FORWARD_ONLY, READ_ONLY с включенной оптимизацией. Аргумент FAST_FORWARD не может быть задан, если задан аргумент SCROLL.Примечание. В SQL Server 2000 аргументы курсора FAST_FORWARD и FORWARD_ONLY взаимно исключают друг друга. Если один из них задан, другой задавать нельзя, иначе возникнет ошибка. В SQL Server 2005 оба ключевых слова могут быть использованы в одной и той же инструкции DECLARE CURSOR.
- READ_ONLY
Предотвращает внесение изменений через этот курсор. Предложение WHERE CURRENT OF не может иметь ссылку на курсор в инструкции UPDATE или DELETE. Этот аргумент имеет преимущество над установленной по умолчанию возможностью обновления курсора.
- SCROLL LOCKS
Указывает, что позиционированные обновления или удаления, осуществленные через курсор, гарантировано будут успешными. SQL Server блокирует строки по мере считывания в курсор для обеспечения их доступности для последующих изменений. Аргумент SCROLL_LOCKS не может быть задан, если задан аргумент FAST_FORWARD.
- OPTIMISTIC
Указывает, что позиционированные обновления или удаления, осуществленные через курсор, не будут выполнены, если строка была обновлена со времени считывания в курсор. SQL Server не блокирует строки по мере их считывания в курсор. Вместо этого используются сравнения значений столбца timestamp или значений контрольных сумм, если в таблице нет столбца timestamp, для определения факта изменения строки после считывания в курсор. Если строка была изменена, то попытки позиционного обновления или удаления будут безрезультатными. Аргумент OPTIMISTIC не может быть задан, если задан аргумент FAST_FORWARD.
- TYPE_WARNING
Указывает, что клиенту будет отправлено предупреждение, если курсор косвенно будет преобразован из одного запрашиваемого типа в другой.
FOR select_statement
Стандартная инструкция SELECT, которая определяет результирующий набор курсора. Ключевые слова COMPUTE, COMPUTE BY, FOR BROWSE и INTO недопустимы в инструкции select_statement объявления курсора.Если используются DISTINCT, UNION, GROUP BY или HAVING, или в аргумент select_list включено статистическое выражение, курсор будет создан как STATIC.
Если каждая из соответствующих таблиц не имеет уникального индекса и курсора SQL-92 SCROLL или запрашивается курсор Transact-SQL KEYSET, он автоматически будет курсором STATIC.
Если аргумент select_statement содержит предложение ORDER BY, в котором столбцы не являются уникальными идентификаторами строк, курсор DYNAMIC будет преобразован в курсор KEYSET, или в курсор STATIC, если курсор KEYSET не может быть открыт. Тоже самое происходит с курсором, определенным при помощи синтаксиса SQL-92, но без ключевого слова STATIC.
- READ ONLY
Предотвращает внесение изменений через этот курсор. Предложение WHERE CURRENT OF не может иметь ссылку на курсор в инструкции UPDATE или DELETE. Этот аргумент имеет преимущество над установленной по умолчанию возможностью обновления курсора. Это ключевое слово отличается от READ_ONLY тем, что между READ и ONLY вместо подчеркивания употребляется пробел.
- UPDATE [OF column_name[ ,... n ] ]
Определяет обновляемые столбцы в курсоре. Если указано предложение OF column_name [,...n], для изменений будут доступны только перечисленные столбцы. Если список не предоставляется, все столбцы могут быть обновлены, если только курсор не был определен как READ_ONLY.
Замечания
После объявления переменной она получает значение в NULL. Используйте инструкцию SET, чтобы назначить значение, отличное от NULL, объявленной переменной. Инструкция SET, которая назначает значение переменной, возвращает одно значение. Если инициализируется несколько переменных, следует использовать отдельные инструкции SET для каждой локальной переменной.
Переменные могут быть использованы только в выражениях, но не вместо имен объектов или ключевых слов. Для создания динамических инструкций Transact-SQL, используйте EXECUTE.
Синтаксические правила для SET **@**cursor_variable не включают ключевые слова LOCAL и GLOBAL. Если используется синтаксис SET **@**cursor_variable = CURSOR..., курсор создается как GLOBAL или LOCAL, в зависимости от установок параметра базы данных по умолчанию локальный курсор.
Переменные курсора всегда локальные, даже если ссылаются на глобальный курсор. Если переменная курсора ссылается на глобальный курсор, курсор имеет ссылки как на глобальный, так и на локальный курсоры. Дополнительные сведения см. в примере В.
Дополнительные сведения см. в разделе DECLARE CURSOR (Transact-SQL).
Разрешения
Необходимо быть членом роли public. Все пользователи могут использовать инструкцию SET **@**local_variable.
Примеры
A. Печать значения переменной, инициализированной при помощи SET
Следующий пример создает переменную @myvar
, записывает строковое значение в переменную и печатает значение переменной @myvar
.
DECLARE @myvar char(20);
SET @myvar = 'This is a test';
SELECT @myvar;
GO
Б. Использование локальной переменной, значение которой назначено при помощи SET в инструкции SELECT
Следующий пример создает локальную переменную с именем @state
и использует ее в инструкции SELECT
для нахождения имен и фамилий всех работников, которые живут в штате Oregon
.
USE AdventureWorks;
GO
DECLARE @state char(25);
SET @state = N'Oregon';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name, City
FROM HumanResources.vEmployee
WHERE StateProvinceName = @state;
В. Использование SET с глобальным курсором
Следующий пример создает локальную переменную и устанавливает переменную курсора в значение имени глобального курсора.
DECLARE my_cursor CURSOR GLOBAL
FOR SELECT * FROM Purchasing.ShipMethod
DECLARE @my_variable CURSOR ;
SET @my_variable = my_cursor ;
--There is a GLOBAL cursor declared(my_cursor) and a LOCAL variable
--(@my_variable) set to the my_cursor cursor.
DEALLOCATE my_cursor;
--There is now only a LOCAL variable reference
--(@my_variable) to the my_cursor cursor.
Г. Определение курсора при помощи SET
Следующий пример использует инструкцию SET
для определения курсора.
DECLARE @CursorVar CURSOR;
SET @CursorVar = CURSOR SCROLL DYNAMIC
FOR
SELECT LastName, FirstName
FROM AdventureWorks.HumanResources.vEmployee
WHERE LastName like 'B%';
OPEN @CursorVar;
FETCH NEXT FROM @CursorVar;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM @CursorVar
END;
CLOSE @CursorVar;
DEALLOCATE @CursorVar;
Д. Присваивание значения из запроса
Следующий пример использует запрос для присваивания значения переменной.
USE AdventureWorks;
GO
DECLARE @rows int;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;
Е. Присваивание значения переменной пользовательского типа путем изменения свойства типа
Следующий пример устанавливает значение для пользовательского типа Point
путем изменения значения свойства типа X
.
DECLARE @p Point;
SET @p.X = @p.X + 1.1;
SELECT @p;
GO
Ж. Присваивание значения переменной пользовательского типа путем вызова метода типа
Следующий пример устанавливает значение пользовательского типа point путем вызова метода SetXY
типа.
DECLARE @p Point;
SET @p=point.SetXY(23.5, 23.5);
См. также
Справочник
DECLARE @local\_variable (Transact-SQL)
EXECUTE (Transact-SQL)
SELECT (Transact-SQL)
SET (Transact-SQL)
Другие ресурсы
Выражения (компонент Database Engine)
Использование переменных и параметров (ядро СУБД)