Sql 重置光标';每次启动脚本时,都会将位置移动到起始位置

Sql 重置光标';每次启动脚本时,都会将位置移动到起始位置,sql,sql-server,tsql,cursor,Sql,Sql Server,Tsql,Cursor,我目前正在学习T-SQL过程和游标,但最近我遇到了这个问题。如何重置从过程返回的光标的起始位置(从中获取所有数据之后)?我在以下上下文中有一个游标: CREATE PROCEDURE dbo.my_procedure @curs CURSOR VARYING OUTPUT AS SET @curs = CURSOR SCROLL FOR select book_name, author_lastname from dbo.books; OP

我目前正在学习
T-SQL
过程和游标,但最近我遇到了这个问题。如何重置从过程返回的光标的起始位置(从中获取所有数据之后)?我在以下上下文中有一个游标:

CREATE PROCEDURE dbo.my_procedure
    @curs CURSOR VARYING OUTPUT
AS
    SET @curs = CURSOR
    SCROLL FOR
        select book_name, author_lastname
        from dbo.books;
OPEN @curs;
go

declare @tmp_curs cursor;
declare @val_1 varchar(35), @val_2 varchar(35);


EXEC dbo.my_procedure @tmp_curs output;
WHILE (@@FETCH_STATUS = 0)
BEGIN
    print @val_1 + ' ' + @val_2 + ';'
    FETCH NEXT FROM @tmp_curs
    INTO @val_1, @val_2;
END;
CLOSE @tmp_curs;
DEALLOCATE @tmp_curs;
go
当我第一次运行这个脚本时,我得到了我需要的结果(来自光标的条目)。但当我下一次运行这个时,我只得到如下结果

(受影响的100排)

而不是实际的条目,因此我必须重新启动ServerManagementStudio

我试过和你一起工作
@@FETCH\u状态
, 重新执行程序,以及
关闭打开的游标,但对我来说似乎没有任何效果。如何在每次运行此脚本时获得相同的结果(来自游标的条目)?

如果我理解正确,您可以使用
先从中获取:

DECLARE @tmp_curs cursor;
DECLARE @val_1 varchar(35), @val_2 varchar(35);

-- first run
EXEC dbo.my_procedure @tmp_curs output;
FETCH FIRST FROM @tmp_curs INTO @val_1, @val_2;
WHILE (@@FETCH_STATUS = 0)
BEGIN
    INSERT INTO books2 VALUES (@val_1, @val_2);
    FETCH NEXT FROM @tmp_curs
    INTO @val_1, @val_2; 
END;
CLOSE @tmp_curs;
DEALLOCATE @tmp_curs;

-- second run
EXEC dbo.my_procedure @tmp_curs output;
FETCH FIRST FROM @tmp_curs INTO @val_1, @val_2;
WHILE (@@FETCH_STATUS = 0)
BEGIN
    INSERT INTO books2 VALUES (@val_1, @val_2);
    FETCH NEXT FROM @tmp_curs
    INTO @val_1, @val_2;
END;
CLOSE @tmp_curs;
DEALLOCATE @tmp_curs;

-- checking
SELECT *
FROM books2;

@RANDOMGY它是否有用?