4

リンク サーバーでストアド プロシージャを実行するときに発生する 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, Level 16, State 1, Procedure RaiseError, Line 13 An error'

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 に答える