0

我想使用游标从存储过程中检索结果。请查看以下存储过程。

CREATE PROCEDURE Test
@ID INT
AS 
BEGIN

        DECLARE @Name VARCHAR(400);
        DECLARE ACursor CURSOR FOR EXEC AStoredProcedure @ID

    OPEN ACursor;
    FETCH NEXT FROM ACursor INTO @Name;

        WHILE @@FETCH_STATUS = 0
        BEGIN
            PRINT @NAME
        END
    CLOSE ACursor;
    DEALLOCATE ACursor;

END

我有这个错误。但我想这样使用。我怎样才能做到这一点?

PS。我无法为存储过程插入 EXEC 语句。因为存储过程已经使用了这个语句,我不想​​对这个存储过程做任何更改。

4

2 回答 2

0

您忘记在循环中获取下一行:

CREATE PROCEDURE Test
@ID INT
AS 
BEGIN

        DECLARE @Name VARCHAR(400);
        DECLARE ACursor CURSOR FOR EXEC AStoredProcedure @ID

    OPEN ACursor;
    FETCH NEXT FROM ACursor INTO @Name;

        WHILE @@FETCH_STATUS = 0
        BEGIN
            PRINT @NAME
            FETCH NEXT FROM ACursor INTO @Name;
        END
    CLOSE ACursor;
    DEALLOCATE ACursor;

END

这应该重写为:

    OPEN ACursor;
    WHILE 1 = 1
    BEGIN
        FETCH NEXT FROM ACursor INTO @Name;

        IF @@FETCH_STATUS <> 0
        BEGIN
            BREAK
        END
        PRINT @NAME
    END
    CLOSE ACursor;
    DEALLOCATE ACursor;

这样fetch,您的代码中只有一个。现在很难忘记它,您也不必将添加到游标查询的列分别附加到每个提取中。

光标是邪恶的,但有时是必要的。为了加快它们的使用fast_forwardstatic关键字,并使用local以便代码中的错误不会留下打开的光标。

于 2012-08-09T08:03:07.670 回答
0

您需要为@ID 指定数据类型,可能是@ID INT

于 2012-08-09T03:49:41.110 回答