Страницы

Поиск по вопросам

пятница, 21 июня 2019 г.

Перезапуск курсора

Подскажите, можно ли заставить курсор вернуться сразу на первую запись после завершения и выполнить опять полный проход от начала и до конца?


Ответ

Это можно сделать с помощью команды FETCH FIRST. Для этого курсор должен быть объявлен с опцией SCROLL
Пример:
declare @table table (ID int); insert into @table values (1), (2), (3), (4), (5);
declare cs cursor local scroll for select ID from @table order by checksum(newid());
declare @id int; open cs;
declare @pass int = 1, @maxPass int = 2; while 1 = 1 begin fetch next from cs into @id;
if @@fetch_status != 0 begin if @pass < @maxPass begin set @pass += 1; -- перемещаемся в начало, если нужен ещё один проход: fetch first from cs into @id; -- вариант, если нужно переоткрыть курсор: --close cs; --open cs; --fetch next from cs into @id; end; else -- иначе завершение break; end;
print @id; end;
close cs; deallocate cs;
Вместо перемещения в начало можно также переоткрывать курсор парой команд CLOSE и OPEN, тогда опция SCROLL не понадобится. При этом, однако, следует учитывать, что при закрытии курсора освобождаются блокировки, которые могли быть установлены при использовании курсора, что не всегда желательно. Т.е. CLOSE + OPEN не эквивалентно FETCH FIRST полностью.

Комментариев нет:

Отправить комментарий