Галерея
7757 8119 8300 8698 8817 9504 9722 9937
Интересные записи
Топовые новости
Новое

Команда DECLARE CURSOR советы и хитрости SQL Server

Платформа SQL Server поддерживает стандарт ANSI, а также довольно много расширений, которые позволяют гибко управлять тем, как курсор перемещается по результирующему набору и манипулирует данными. Используется следующий синтаксис.

DECLARE имя_курсора [INSENSITIVE] [SCROLL] CURSOR [LOCAL | GLOBAL] [FORWARD_ONLY | SCROLL]
[STATIC | KEYSET | DYNAMIC | FAST_FORWARD] [READ_ONLY | SCROLL, LOCKS | OPTIMISTIC] [TYPE_WARNING]
FOR инструкция_select
[FOR {READ ONLY | UPDATE [OF имя_столбца [, …]]}]

Параметры приводятся ниже.

LOCAL | GLOBAL

Ограничивает область действия курсора либо локальным пакетным заданием Transact-SQL, либо делает курсор доступным для всех пакетных заданий Transact-SQL, запущенных в ходе текущего сеанса инструкциями OPEN и FETCH. На глобальное имя курсора можно ссылаться из любой хранимой процедуры, функции или пакетного задания Transact-SQL, запущенного в текущем сеансе. Глобальный курсор неявно освобождается (deallocate) по завершении сеанса, но локальный курсор необходимо освобождать вручную. Ключевые слова LOCAL и GLOBAL являются необязательными. По умолчанию, если не указано ни одно из них, поведение определяется свойством базы данных default to local.

INSENSITIVE | FORWARDJDNLY | SCROLL

Определяет, как курсор перемещается по результирующему набору. Есть три варианта. INSENSITIVE

Результирующий набор создается в виде таблицы в базе TEMPDB. Изменения, вносимые в базовую таблицу, не отражаются на результирующем наборе данных курсора. Предложение несовместимо с расширениями инструкции DECLARE CURSOR, имеющимися в SQL Server, такими, как LOCAL, GLOBAL, STATIC, KEYSET, DYNAMIC, FASTFORWARD и так далее. Может использоваться только в инструкции DECLARE CURSOR стиля SQL92, например DECLARE образец CURSOR INSENSITIVE FOR инструкция_select FOR UPDATE.

FORWARDJDNLY

Показывает, что курсор должен перемещаться от первой к последней записи в результирующем наборе и единственной поддерживаемой формой инструкции FETCH является FETCH NEXT. Если не используются ключевые слова STATIC или KEYSET, предполагается, что курсор объявлен как DYNAMIC. Предложения FAST_FORWARD и FORWARDJDNLYявляются взаимоисключающими.

SCROLL

Включаются все опции инструкции FETCH (ABSOLUTE, FIRST, LAST, NEXT, PRIOR и RELATIVE). В противном случае доступна только опция FETCH NEXT. Если используются ключевые слова DYNAMIC, STATIC или KEYSET, предложение SCROLL используется по умолчанию. Предложения FASTJFORWARD и FORWARDJDNLYявляются взаимоисключающими.

STATIC | KEYSET DYNAMIC FASTFORWARD

Определяет, как осуществляется манипулирование данными в результирующем наборе. Эти параметры несовместимы с предложениями FOR READ ONLY и FOR UPDATE. Существует четыре опции.

STATIC

Создается временная копия результирующего набора данных, которая сохраняется в базе данных tempdb. Модификации, внесенные в исходную таблицу, при обработке курсора не видны. Курсоры с предложением STATIC не могут изменять данные в исходной таблице или представлении.

KEYSET

В базе данных tempdb создается временная копия результирующего набора с членством и фиксированным порядком строк (который также называется набором ключей, keyset). Набор ключей связывает данные в результирующем наборе данных курсора с базовой таблицей или представлением, и курсор может видеть изменения, вносимые в базовые данные. Измененные или удаленные строки имеют @@FETCH_STATUS, равный -2 (если обновление не проводилось с помощью инструкции UPDATE…WHERE CURRENT OF, в противном случае они видны полностью), тогда как строки, вставленные другими пользователями, не видны вообще.

DYNAMIC

Записи в результирующем наборе данных курсора определяются при выполнении каждой операции FETCH. Таким образом, курсоры с предложением DYNAMIC видят все изменения, вносимые в базовую таблицу или представление, даже те, которые внесены другими пользователями. Поскольку результирующий набор может постоянно изменяться, курсоры DYNAMIC не поддерживают предложение FETCH ABSOLUTE.

FASTFORWARD

Создается курсор FORWARD ONLY READ ONLY, который быстро прочитывает весь результирующий набор курсора сразу.

Источник