EXEC sp_executesql-从存储过程调用捕获返回值和输出值

EXEC sp_executesql-从存储过程调用捕获返回值和输出值,sql,sql-server,sp-executesql,Sql,Sql Server,Sp Executesql,给定一个简单的存储过程,它填充输出参数,并返回一个值,例如: 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',

给定一个简单的存储过程,它填充
输出
参数,并
返回一个值,例如:

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”,但未提供该参数


您还需要将这两个值作为
OUTPUT
参数传递给
sp_executesql

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;

但我必须问,你为什么要这样做?这个SQL没有任何动态性,所以为什么要使用
sp\u executesql
?我还建议不要使用SP的返回值;您确实应该使用另一个
输出
参数。

这里不需要
sp\u executesql
,因为存储过程名称是动态的

接受
@module\u name\u var

你能行

DECLARE @ret       INT,
        @param_out INT
DECLARE @procname SYSNAME = 'sp_test'

EXEC @ret = @procname
  @param_out OUTPUT 

而名为
@procname
的过程将被执行

为什么要在
sp_executesql
中包装调用?我实际上是在动态地将存储过程名构建为字符串,这只是一个示例,演示了我在输出和返回值方面遇到的问题。因此,您不需要
sp_executesql
。另外,存储过程返回代码应该用于指示成功或警告/错误,而不是返回数据。很好,现在您已经指出了我的错误,我非常清楚地看到了。没错,这个例子没有什么动态性,但我实际上动态地构建了调用“真实”SQL的过程。谢谢你的帮助!