EXEC sp_executesql-从存储过程调用中捕获RETURN值和OUTPUT值

时间:2019-03-15 11:20:04

标签: sql sql-server sp-executesql

给出一个简单的存储过程,该过程将填充一个OUTPUT参数,并且还RETURN包含一个值,例如:

CREATE PROCEDURE sp_test 
(
    @param_out INT OUTPUT
)
AS BEGIN
    SELECT @param_out = 9
    RETURN 2
END

如何使用sp_executesql调用此过程并捕获这两个值?

我尝试过:

DECLARE @ret INT, @param_out INT
EXEC SP_EXECUTESQL N'EXEC @ret = sp_test',
    N'@ret INT OUTPUT, @param_out INT OUTPUT',
    @ret OUTPUT,
    @param_out OUTPUT

SELECT @ret, @param_out

但是,它抱怨没有提供@param_out

  

过程或函数'sp_test'需要未提供的参数'@param_out'。

2 个答案:

答案 0 :(得分:5)

您还需要将两个值都作为MemberOf参数传递到OUTPUT

sp_executesql

我必须问,为什么要这么做?此SQL没有动态变化,所以为什么要使用DECLARE @ret int, @param_out int; EXEC sp_executesql N'EXEC @ret = sp_test @param_out OUT;', N'@ret INT OUTPUT, @param_out INT OUTPUT', @ret OUTPUT, @param_out OUTPUT; SELECT @ret, @param_out; ?我也建议不要使用SP的返回值;您确实应该使用另一个sp_executesql参数。

答案 1 :(得分:0)

您仅在此处不需要setValue(...)就是因为存储过程名称是动态的。

EXEC grammar接受sp_executesql

您可以

@module_name_var

,名称为DECLARE @ret INT, @param_out INT DECLARE @procname SYSNAME = 'sp_test' EXEC @ret = @procname @param_out OUTPUT 的过程将被执行