4

我试图捕获在链接服务器上执行存储过程时引发的 sql 错误。两台服务器都运行 SQL Server 2005。

为了证明这个问题,我在链接服务器上创建了一个名为 Raise error 的存储过程,它执行以下代码:

RAISERROR('An error', 16, 1);

如果我使用以下代码直接在链接服务器上执行存储过程,我会得到一个结果集,如预期的那样 'An error', '16' (即代码进入 catch 块):

BEGIN TRY
EXEC [dbo].[RaiseError];
END TRY
BEGIN CATCH
    DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int;
    SELECT @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY();
    SELECT @ErrMsg, @ErrSeverity;
END CATCH

如果我在本地服务器上运行以下代码以在链接服务器上执行存储过程,则 SSMS 会给我消息“查询完成但出现错误”,.Msg 50000,级别 16,状态 1,过程 RaiseError,第 13 行错误“

BEGIN TRY
    EXEC [Server].[Catalog].[dbo].RaiseError
END TRY
BEGIN CATCH
    DECLARE @SPErrMsg nvarchar(4000), @SPErrSeverity int;
    SELECT @SPErrMsg = ERROR_MESSAGE(), @SPErrSeverity = ERROR_SEVERITY();
    SELECT @SPErrMsg, @SPErrSeverity;
END CATCH

我的问题是我可以捕捉到链接服务器存储过程执行时产生的错误吗?

提前致谢!

4

2 回答 2

4

请参阅处理服务器到服务器远程存储过程中的错误

从远程存储过程内部调用严重性小于 20 的 RAISERROR 会导致远程服务器上出现语句中止错误。本地服务器上的 TRY…CATCH 构造仅处理远程批处理中止错误。如果远程存储过程调用严重性小于 20 的 RAISERROR,并且远程存储过程的范围在本地服务器上的 TRY 块内,则 RAISERROR 不会导致控制权传递给 TRY...CATCH 构造的 CATCH 块。但是,远程服务器上严重性为 20 或更高的 RAISERROR 会中断连接,并且本地服务器上的执行将传递给 CATCH 块。

于 2010-03-23T22:29:20.920 回答
4

这会在本地返回错误信息:

EXEC ('your.fullyqualified.storedprocname') AT YOUR_LINKED_SERVER;
于 2013-05-28T10:50:52.653 回答