【问题标题】:EXEC sp_executesql - capture RETURN value and OUTPUT value from stored procedure callEXEC sp_executesql - 从存储过程调用中捕获 RETURN 值和 OUTPUT 值
【发布时间】:2019-03-15 11:20:04
【问题描述】:

给定一个简单的存储过程,它填充一个OUTPUT 参数和一个RETURNs 值,例如:

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”,但未提供。

【问题讨论】:

  • 你为什么还要在sp_executesql 中封装电话?
  • 我实际上是动态地将存储过程名称构建为字符串,这只是一个示例,用于演示我在使用 OUTPUT 和 RETURN 值时遇到的问题。
  • 所以你不需要sp_executesql

标签: sql sql-server sp-executesql


【解决方案1】:

您还需要将这两个值作为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_executesql?我还建议不要使用 SP 的返回值;你真的应该使用另一个OUTPUT 参数。

【讨论】:

  • 补充说存储过程返回码应该用于指示成功或警告/错误,而不是返回数据。
  • 完美,既然你已经指出了我的错误,我已经很清楚地看到了。你的权利,这个例子没有什么动态的,但我实际上动态地构建了调用我的“真实”SQL的过程。感谢您的帮助!
【解决方案2】:

这里不需要sp_executesql,因为存储过程名称是动态的。

EXEC grammar 接受 @module_name_var

你可以的

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

EXEC @ret = @procname
  @param_out OUTPUT 

名称在@procname的过程会被执行

【讨论】:

    猜你喜欢
    • 2017-05-29
    • 2012-11-16
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多