【问题标题】:TRY CATCH with Linked Server in SQL Server 2005 Not Working尝试使用 SQL Server 2005 中的链接服务器不工作
【发布时间】:2010-03-23 21:03:01
【问题描述】:

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

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

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

如果我使用以下代码直接在链接服务器上执行存储过程,我会得到一个带有“错误”、“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

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

提前致谢!

【问题讨论】:

    标签: sql-server linked-server try-catch


    【解决方案1】:

    Handling Errors in Server-to-Server Remote Stored Procedures:

    调用严重程度较低的 RAISERROR 超过 20 个来自远程存储的 过程导致语句中止 远程服务器上的错误。一种 TRY…CATCH 在本地构造 服务器处理远程批处理中止 仅错误。如果远程存储 过程调用 RAISERROR 严重性小于 20 和远程 存储过程的范围是 本地服务器上的 TRY 块, RAISERROR 不会导致控制 传递给 CATCH 块 TRY…CATCH 构造。然而, 严重性为 20 或更高的 RAISERROR 在远程服务器上打破 连接,并在本地执行 服务器传递给 CATCH 块。

    【讨论】:

    • 是的。文章msdn.microsoft.com/en-us/library/ms191515.aspx 对此进行了解释。烦人,因为您需要成为 sysadmin 角色或具有 ALTER TRACE 权限的用户,并使用 WITH LOG 引发严重性为 20 到 25 的错误。
    【解决方案2】:

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

    EXEC ('your.fullyqualified.storedprocname') AT YOUR_LINKED_SERVER;
    

    【讨论】:

    • 这正是我想要的!一种在本地返回远程链接服务器错误的方法!我们还可以输入任何 SQL 语句,例如 EXEC ('select * from orders') AT <<LINKED_SERVER_NAME>>
    猜你喜欢
    • 2012-03-02
    • 2013-08-08
    • 2021-08-15
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多