存储过程1:
CREATE PROCEDURE [dbo].[pro_get_cursor]
@In_TableName nvarchar(200),
@Out_CurrencyCursor CURSOR VARYING OUTPUT
AS
declare @sql nvarchar(2000)
set @sql=N'DECLARE CurrencyCursor CURSOR
FORWARD_ONLY STATIC FOR
SELECT * FROM '+@In_TableName
EXEC(@sql)
OPEN CurrencyCursor;
SET @Out_CurrencyCursor = CurrencyCursor;
存储过程2:(调用存储过程1)
CREATE PROCEDURE [dbo].[pro_test_c]
AS
BEGIN
DECLARE @MyCursor CURSOR;
declare @str1 varchar(100)
declare @str2 varchar(100)
declare @str3 varchar(100)
declare @str4 nvarchar(100)
declare @str5 nvarchar(100)
declare @i int=1
EXEC dbo.pro_get_cursor '表名',@Out_CurrencyCursor = @MyCursor OUTPUT;
FETCH NEXT FROM @MyCursor into @str1,@str2,@str3,@str4,@str5
WHILE (@@FETCH_STATUS = 0)
BEGIN;
print convert(nvarchar(5),@i)
set @i= @i+1
FETCH NEXT FROM @MyCursor into @str1,@str2,@str3,@str4,@str5
END;
CLOSE @MyCursor;
DEALLOCATE @MyCursor
--注意此处: 调用存储过程1的游标的不能再次CLOSE,只能催毁对像。否则异常发生。
--CLOSE CurrencyCursor
DEALLOCATE CurrencyCursor
--以下代码可以用来查看游标的列表
--DECLARE @Report CURSOR
-- Execute sp_cursor_list into the cursor variable.
--EXEC master.dbo.sp_cursor_list @cursor_return = @Report OUTPUT,
-- @cursor_scope = 3
---- Fetch all the rows from the sp_cursor_list output cursor.
--FETCH NEXT from @Report
--WHILE (@@FETCH_STATUS <> -1)
--BEGIN
-- FETCH NEXT from @Report
--END
--CLOSE @Report
--DEALLOCATE @Report
END