与主题一样。我可以简单地将光标的位置重置为Transact-SQL中的开头,以便它可以在表上再次运行吗?我想在以下上下文中重置它:
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
答案 0 :(得分:28)
你需要将光标声明为滚动,就像这样
declare c scroll cursor for (select statement);
然后在任何时候定位到第一个只需使用以下
fetch first from c;
答案 1 :(得分:12)
可以使用的另一个不强制你改变光标类型的选项就是close光标并重新open它:
CLOSE user_cursor
OPEN user_cursor
但scroll
option在资源使用方面会更便宜,如果这是你可以接受的改变。
答案 2 :(得分:1)
光标检索的数据不会改变。
STATIC
定义一个游标,该游标用于生成游标要使用的数据的临时副本。所有对游标的请求都是从tempdb中的临时表中回答的;因此,对基表的修改不会反映在对此游标进行的提取返回的数据中,并且此游标不允许修改。
答案 3 :(得分:-4)
使用游标循环及其照顾...
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;