如何从使用 sp_executesql 执行的存储过程中获取返回值

Wil*_*Cau 1 sql-server sql-server-2008-r2

我需要调用另一个数据库中的存储过程并检查返回值。其他数据库的名称可能会有所不同,因此我尝试使用 sp_executesql,但我一直无法找到如何从该过程中获取返回值。

这是我所拥有的简化版本:

DECLARE @errorLogId INT
DECLARE @otherDbName NVARCHAR(MAX) = 'Foo' -- Get the database name from somewhere
DECLARE @sql NVARCHAR(MAX)

SET @sql = @otherDbName + '.dbo.SomeProc'

-- I want @errorLogId to be the return value from SomeProc, this didn't work.    
EXECUTE @errorLogId = sp_executesql @sql

IF @errorLogId <> 0
   RAISERROR('SomeProc failed, ErrorLogId = %d.', 16, 1, @errorLogId) WITH SETERROR
Run Code Online (Sandbox Code Playgroud)

如果 SomeProc 中发生错误,它会被捕获并将条目写入错误表(在另一个数据库中),然后 SomeProc 返回所写入记录的错误表 ID(标识)。否则 SomeProc 返回 0。

我知道 SomeProc 失败,因为错误被写入另一个数据库中的错误日志,但在本地数据库中 @errorLogId 为 0,这被视为成功。我认为返回值会“通过”sp_executesql,但我认为返回值实际上来自 sp_executesql 而不是 SomeProc(即,无论 SomeProc 成功还是失败,sp_executesql 都可以成功)。

有没有办法访问本地数据库中@otherDbName.dbo.SomeProc 的返回值?

谢谢

cha*_*cha 5

您需要使用 OUTPUT 参数,如MSDN文章中所述:

鉴于这个虚拟存储过程:

CREATE PROCEDURE sp_test AS
RETURN 2
Run Code Online (Sandbox Code Playgroud)

此代码将为您提供结果:

declare @ret int

exec sp_executesql N'exec @ret = sp_test', N'@ret int OUTPUT', @ret = @ret OUTPUT 
select @ret as result


result
-----------
2

(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)