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它是否有用?