/*
Т.к. все описанные до выполнения команды go переменные более недоступны, то снова описываем строковую переменную и 3 вспомогательные целочисленные переменные и помещаем в строковую переменную имя тестовой таблицы.
Используя эту переменную и команду DELETE, удаляем строку таблицы, которая имеет значение столбца c2 = 4.
*/
declare @var varchar(128),
@c1 int,
@c2 int,
@fetch_res int
set @var = 'table1'
execute ('delete ' + @var + ' where c2 = 4')
/*
Цикл, который осуществлял в прошлом примере поочередный выбор всех строк из курсора, в общем случае не очень удачен, т.к. имеет следующие недостатки:
1. Требуется первоначальное извлечение строки перед циклом.
2. Рассматривается только 1 вариант неудачной выборки (функция возвращает -1). Если же будет попытка выборки несуществующей строки, как в рассматриваемом случае, то этот вариант отслежен не будет, что приведет к выводу значений NULL.
3. После выборки последней строки будет еще один выбор из курсора, который даст неудачу (-1), но будет отображен на экране как заголовок без выводимой строки.
Для борьбы с этими недостатками цикл был изменен таким образом, что условие продолжения работы цикла стало всегда истинно; выбор из курсора полностью переместился в цикл и осуществляется в переменные; в случае неудачного выбора из курсора (@@FETCH_STATUS возвращает -1) происходит выход из цикла, а если выбор строки из курсора удачен, то происходит вывод значений переменных на экран с помощью команды SELECT.
*/
while (1 = 1)
Begin
fetch next from cursor2 into @c1, @c2
set @fetch_res = @@FETCH_STATUS
if (@fetch_res = -1)
break;
if (@fetch_res <> -2)
select @c1 as c1, @c2 as c2
End
/*
Закрываем курсор.
*/