gpt4 book ai didi

sql-server - 在 SQL Server 2005 中使用链接服务器 try catch 不工作

转载 作者:行者123 更新时间:2023-12-01 07:12:18 24 4
gpt4 key购买 nike

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

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

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

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

提前致谢!

最佳答案

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

Calling RAISERROR with severity less than 20 from inside a remote stored procedure causes a statement abort error on the remote server. A TRY…CATCH construct on the local server handles remote batch abort errors only. If a remote stored procedure calls RAISERROR with severity less than 20 and the remote stored procedure is scoped within a TRY block on the local server, RAISERROR does not cause control to pass to the CATCH block of the TRY…CATCH construct. However, RAISERROR with severity 20 or greater on the remote server breaks the connection, and execution on the local server passes to the CATCH block.

关于sql-server - 在 SQL Server 2005 中使用链接服务器 try catch 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2503607/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com