我想使用游标从存储过程中检索结果。请查看以下存储过程。
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语句的存储过程。因为存储过程已经使用此语句,我不想对此存储过程进行任何更改。
答案 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_forward
和static
关键字,并使用local
,以便代码中的错误不会留下打开的光标。