如何使用游标填充存储过程

时间:2012-08-09 02:33:54

标签: sql-server tsql stored-procedures

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

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。我不能INSERT EXEC语句的存储过程。因为存储过程已经使用此语句,我不想​​对此存储过程进行任何更改。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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,以便代码中的错误不会留下打开的光标。