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 ] )
    Метод пользовательского типа, который принимает один или несколько аргументов для изменения состояния экземпляра типа. Статические методы должны быть публичными.
  • 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 добавляется по умолчанию.

    ms189484.note(ru-ru,SQL.90).gifПримечание.
    В 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.

    ms189484.note(ru-ru,SQL.90).gifПримечание.
    В 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)
Использование переменных и параметров (ядро СУБД)

Справка и поддержка

Получение помощи по SQL Server 2005