游标内的存储过程未从输出参数更新局部变量

Stored procedure inside cursor not updating local variable from output parameter

我在处理在游标的 while 循环内执行的存储过程的输出参数时遇到问题。

DECLARE @p_in int
DECLARE @p_out char

OPEN crs_clientId

FETCH NEXT FROM crs_clientId INTO @p_in

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @p_in

    EXEC dbo.usp_get_letter_for_number
             @in = @p_in, @out = @p_out OUTPUT;

    PRINT @p_out

    FETCH NEXT FROM crs_clientId INTO @p_in
END

CLOSE crs_clientId
DEALLOCATE crs_clientId

如果我独立运行这个存储过程,我得到:

1
A
2
B
3
C

但是,运行将其置于我得到的光标内:

1
A
2
A
3
A

我错过了什么?为什么存储过程只在第一遍更新 @p_out

我不确定你是如何在输出中得到 1,2,3,4 的。由于代码似乎有问题。

你最后给 cursor 赋值,这似乎是不正确的变量

参见 FETCH NEXT @c_clientId

所以也许您已经发布了一半代码。

或者您需要为正确的变量赋值,即在游标循环结束时 @p_in 以获得正确的值

我尝试用示例程序模拟 return 值

--sample stored procedure
create procedure usp_get_letter_for_number(@in int, @out char(1) OUTPUT)
as
begin
    if @in = 1
        set @out = 'A'
    else if @in = 2
        set @out = 'B'
    else if @in = 3
        set @out =  'C'
    else 
        set @out = 'Z'
end

并使用您的代码并将其更正为使用 @pin 而不是 @c_clientId 示例 SELECT 语句

DECLARE @p_in int
DECLARE @p_out char
DECLARE crs_clientId CURSOR FOR SELECT top 10 id from Users /*Sample sql query*/
OPEN crs_clientId

FETCH NEXT FROM crs_clientId INTO @p_in

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @p_in

    EXEC dbo.usp_get_letter_for_number
             @in = @p_in, @out = @p_out output

    PRINT @p_out

    FETCH NEXT FROM crs_clientId INTO @p_in
END

CLOSE crs_clientId
DEALLOCATE crs_clientId

输出

1
A
2
B
3
C
4
Z
5
Z
:
:

仍然不确定到底是什么问题,但解决方法是在游标的每次传递开始时将 @p_out 设置为 null。出于某种原因,如果 @p_out 不为空,则存储过程的输出不会写入它。

循环现在看起来像这样并且可以正常工作:

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @p_in
    SET @p_out = NULL;

    EXEC dbo.usp_get_letter_for_number
         @in = @p_in, @out = @p_out output

    PRINT @p_out

    FETCH NEXT FROM crs_clientId INTO @p_in
END