Подскажите, можно ли заставить курсор вернуться сразу на первую запись после завершения и выполнить опять полный проход от начала и до конца?
Ответ
Это можно сделать с помощью команды 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 полностью.
Комментариев нет:
Отправить комментарий