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的过程。谢谢你的帮助!