1

ストアド プロシージャ内のエラー処理用のテンプレート、または 99% の失敗またはエラーを処理できる一般的なステートメントだけを作成しようとしています。

SQL トランザクションと try-catch のさまざまな例をオンラインで調べた後、同僚と共有したいこのテンプレートを思いつきました。

BEGIN TRY
   BEGIN TRAN
      --Place code in here. 



      --Your Code Ends Here
   COMMIT
END TRY
BEGIN CATCH
   -- There was an error
   IF @@TRANCOUNT > 0
   ROLLBACK --Rolls back from where error first discovered. All code after error not run.

   -- Raise an error with the details of the exception
   DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int

   SELECT @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY()
   RAISERROR(@ErrMsg, @ErrSeverity, 1) --This will be picked up by .NET Exception handler.
END CATCH

ありがとう!

4

1 に答える 1

1

proc の動作によっては、エラーに関するより多くのデータをログ テーブルに保存するとよい場合があります。たとえば、エラー メッセージだけでなく、proc に送信されたパラメーターを保存して、問題の原因となったデータを正確に把握してトラブルシューティングできるようにすることもできます。複雑な挿入の場合によくあるように、proc に多くのステップがある場合は、1000 行の proc に直面したときに一部のエラー メッセージが役に立たない可能性があるため、エラーが発生したときに実行していたステップに関する情報を保存することをお勧めします。これを行う方法は、ログ テーブルに格納するフィールドを含むテーブル変数を最初に設定することです。次に、手順に従ってデータを挿入します。すべてのステップをテーブル変数に保存するか、各ステップを実行する直前に新しいステップのデータに置き換えるかを選択できます。次に、catch ブロックをヒットすると、テーブル変数がエラー メッセージ データで更新されます。トランザクションをロールバックした後もテーブル変数を使用できるため、ロールバック後にそのテーブル変数を使用してロギング テーブルに挿入できます。これは、proc がめったに失敗しない場合に問題を診断するのに特に役立ちます。

于 2013-04-30T17:33:30.020 に答える