Выполняем команду принудительного завершения транзакции. После нее все объявленные переменные, локальные курсоры становятся недоступны.
*/
go
/*
Описываем переменную типа курсор и ставим ей в соответствии глобальный курсор cursor1
*/
declare @cursor cursor
set @cursor = cursor1
/*
Открываем курсор.
*/
open @cursor
/*
Извлекаем 1-ую строку из курсора (используя опцию по умолчанию NEXT).
*/
fetch @cursor
/*
Т.к. все описанные до выполнения команды go переменные более недоступны, то снова описываем строковую переменную и помещаем в нее имя тестовой таблицы. Используя эту переменную и команду UPDATE, изменяем значение столбца c2 в выбранной строке. Строка задается с помощью конструкции WHERE CURRENT OF <имя курсора>, которая указывает на ту строку таблицы, которая является текущей строкой для курсора.
После указанного изменения с помощью команды SELECT выводим все значения столбцов c1, c2, которые принадлежат строкам, удовлетворяющим следующему условию: значения поля c1 лежат на отрезке [2..4].
*/
declare @var varchar(128)
set @var = 'table1'
execute ('update ' + @var + ' SET c2 = 3 where current of cursor1')
execute ('select c1, c2 from ' + @var + ' where c1 between 2 and 4')
/*
Т.к. курсор динамический, то он отображает все изменения, произведенные в базовой таблице. Таким образом, выполнив следующую команду UPDATE, которая изменяет значения столбца c2 в той строке, где c2 был равен 4, мы можем в этом убедиться, последовательно извлекая в цикле WHILE все строки из описанного курсора. Цикл работает, пока функция @@FETCH_STATUS выдает значения отличные от -1, т.е. пока извлекаемая строка не вышла за пределы диапазона. Такой цикл применим, т.к. курсор динамический (значение -2 возвращено не будет).
*/
execute ('update ' + @var + ' SET c2 = 13 where c2 = 4')
while @@FETCH_STATUS <> -1
Begin
fetch next from @cursor
End
/*
Закрываем курсор.
*/
close @cursor
Пример 2.
/*
Проверяем существование описываемого курсора с помощью функции cursor_status. Если курсор существует, то выполняем по отношению к нему команду DEALLOCATE