在SQL中,我能否在另一个存储过程中将存储过程的结果获取到游标中?

13

我试图将存储过程的结果放入光标中,在当前过程中使用。 我已经添加了我的代码,但我不确定是否可能或者我的语法是否正确?

DECLARE cursorIDList CURSOR FOR
    EXEC spGetUserIDs
OPEN cursorIDList

FETCH NEXT FROM cursorIDList INTO @ID

我收到以下错误信息:在“EXEC”附近出现语法错误。期望“SELECT”,“(”或“WITH”。

提前致谢。


是的,我收到了一个错误:'EXEC' 附近的语法不正确。期望 SELECT、'(' 或 WITH。 - Sun
3个回答

13
你可以这样做:
DECLARE @t TABLE (ID INT)
INSERT INTO @t
EXEC spGetUserIDs

DECLARE cursorIDList CURSOR FOR
    SELECT * FROM @t
OPEN cursorIDList

FETCH NEXT FROM cursorIDList INTO @ID

太棒了,如果存储过程返回超过1列,它们能在新声明的表中匹配吗?再次感谢。 - Sun
不。您需要创建与过程返回的列数相同的表。 - Madhivanan
在存储过程返回结果之前,您必须已经有一个具有匹配列的表变量,并且必须知道存储过程返回的数据集中每个列的数据类型,并根据这些信息在调用该存储过程之前创建它们。 - Ivan Golović

0

在我看来,一个非常有趣的方法是将游标作为参数使用(尽管如果您不打算更新表,我认为这不是更好的选择):

create Table dbo.MyTable
(
    i int 
);
Insert Into dbo.MyTable (i) values (1)
Insert Into dbo.MyTable (i) values (2)
Insert Into dbo.MyTable (i) values (3)
Insert Into dbo.MyTable (i) values (4)
Go
Set NoCount ON;
Go
Create Proc dbo.myProc 
(
    @someValue int,
    @cur Cursor Varying Output
)
As
Begin 
    declare @x int;

    Set @cur = Cursor for
        Select i From dbo.MyTable
        Where i < @someValue;

    open @cur
End
Go
-- Use of proc
declare @cur cursor;
declare @x int;
Exec dbo.myProc 3, @cur output


fetch next from @cur into @x
while @@fetch_status = 0
begin
    print 'value: ' + cast(@x as varchar)
    fetch next from @cur into @x
end

close @cur;
Deallocate @cur;

Go
--Cleanup
Drop Proc dbo.myProc 
Drop Table dbo.MyTable

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接