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 的返回值?
谢谢
您需要使用 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)
归档时间: |
|
查看次数: |
28261 次 |
最近记录: |