游标内的存储过程未从输出参数更新局部变量
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
我在处理在游标的 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