给定一个简单的存储过程,该过程填充了 OUTPUT
参数,而 RETURN
s a值,例如:
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_executesql
?我还建议不要使用SP的返回值;您真的应该使用另一个OUTPUT
参数。
您在这里不需要sp_executesql
,只是因为存储过程名称是动态的。
EXEC
语法接受@module_name_var
。
您可以做
DECLARE @ret INT,
@param_out INT
DECLARE @procname SYSNAME = 'sp_test'
EXEC @ret = @procname
@param_out OUTPUT
和@procname
中名称的过程将被执行