簡體   English   中英

SQL Server 2005中的鏈接服務器的TRY CATCH不起作用

[英]TRY CATCH with Linked Server in SQL Server 2005 Not Working

我正在嘗試捕獲在鏈接服務器上執行存儲過程時引發的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會向我顯示消息“查詢已完成,但有錯誤”。Msg50000,級別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

我的問題是,我可以捕獲鏈接服務器存儲過程執行時生成的錯誤嗎?

提前致謝!

請參閱服務器到服務器遠程存儲過程中的處理錯誤

從遠程存儲過程內部以低於20的嚴重性調用RAISERROR會導致遠程服務器上的語句中止錯誤。 本地服務器上的TRY…CATCH構造僅處理遠程批處理中止錯誤。 如果遠程存儲過程以低於20的嚴重性調用RAISERROR,並且遠程存儲過程的作用域位於本地服務器上的TRY塊內,則RAISERROR不會導致控制權傳遞給TRY…CATCH構造的CATCH塊。 但是,遠程服務器上嚴重性為20或更高的RAISERROR斷開了連接,本地服務器上的執行傳遞給CATCH塊。

這將在本地返回錯誤信息:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM