28

如题。我可以简单地将光标的位置重置为 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
4

4 回答 4

39

您需要将光标声明为滚动,就像这样

declare c scroll cursor for (select statement); 

然后在任何时候定位到第一个只需使用以下

fetch first from c;
于 2013-06-26T10:48:11.377 回答
22

另一个不强制您更改游标类型的选项是简单地关闭游标并重新打开它:

CLOSE user_cursor
OPEN user_cursor

但是,如果这是您可以接受的更改,则该scroll选项在资源使用方面会更便宜。

于 2013-06-26T10:54:22.200 回答
1

游标检索到的数据不会改变。

静止的

定义一个游标,该游标制作数据的临时副本以供游标使用。对游标的所有请求都是从 tempdb 中的这个临时表中回答的;因此,对基表所做的修改不会反映在对该游标进行的提取返回的数据中,并且该游标不允许修改。

于 2013-06-26T10:49:22.710 回答
-5

使用游标循环并为您处理...

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;
于 2014-01-29T23:20:48.800 回答