Ответ 1
вам нужно объявить свой курсор как прокрутку, например
declare c scroll cursor for (select statement);
то в любое время для поиска первого используйте только
fetch first from c;
Как и в теме. Могу ли я просто указать позицию курсора reset в начало в Transact-SQL, чтобы он мог снова работать над таблицей? Я хочу reset его в следующем контексте:
DECLARE @userID INT
DECLARE user_cursor CURSOR FOR SELECT userID FROM users
WHILE /* some condition */
BEGIN
...
FETCH NEXT FROM user_cursor INTO @userID
IF @@FETCH_STATUS = 0
BEGIN
/*... here goes the reset of the cursor ...*/
END
...
END
вам нужно объявить свой курсор как прокрутку, например
declare c scroll cursor for (select statement);
то в любое время для поиска первого используйте только
fetch first from c;
Другим вариантом, который не может заставить вас изменить тип курсора, является просто закрыть курсор и повторить, открыть его:
CLOSE user_cursor
OPEN user_cursor
Но параметр scroll
будет дешевле с точки зрения использования ресурсов, если это изменение вы можете принять.
Данные, полученные курсором, не будут изменены.
STATIC
Определяет курсор, который создает временную копию данных, которые будут использоваться курсором. Все запросы к курсору отвечают из этой временной таблицы в tempdb; поэтому изменения, внесенные в базовые таблицы, не отражаются в данных, возвращаемых выборками, сделанными для этого курсора, и этот курсор не допускает изменений.
Используйте контуры курсора и его заботу о вас...
cursor c_something IS
select * from somewhere
BEGIN
for some_row in c_something LOOP
-- do stuff with some_row.COLUMN;
END LOOP; -- this closes the cursor for you when it has gone all the way through
-- do other stuff
for some_row in c_something LOOP -- opens the cursor again from the top
-- do stuff with some_row.COLUMN;
END LOOP;
END;