2

巨大なテーブルを処理し、過去のデータ(1年前まで)をグループ化する(SQL 2005)ストアドプロシージャがあります。今、私はすべての実行をログに記録する新しいテーブル ログとエラー処理を伴うSQL Server 2005ストアドプロシージャ

  • リネームテーブルにある
  • として最近のデータをコピーし、新しいテーブル

  • にグループ化された

    • コピー古いデータ:これは、この主要なステップがありますロギングテーブルのすべてのステップが含まれます。しかし、最初にトランザクションを開始するので、何か問題が生じた場合にバッチ全体をロールバックできます。しかし、それはまた、私が望むものではない私の記録をロールバックするでしょう。

      どうすれば解決できますか?

  • 答えて

    1

    トランザクションでロールバックされず、コミットまたはロールバック後のプロシージャの最後に、永続ロギング表に表変数の内容を挿入するため、表変数にログします。

    +0

    さらにいくつかのステップが必要ですが、ログテーブル変数の永続化を制御できない致命的なエラーはありません。 – Koen

    +0

    @Koen - あなたがそれに対応しなければならない場合(例えば、接続を終了する重大度の高いエラー)、私が示唆できるのは、イベントログまたはトレース([ユーザーが設定できるSQL Server Profilerイベント] /weblogs.sqlteam.com/mladenp/archive/2008/10/16/Custom-user-configurable-SQL-Server-Profiler-events.aspx)) –

    1
    • 使用SET XACT_ABORT ON TRY/CATCHブロックを使用し、(コードが実行される)すべてのエラーをキャッチするには、ロールバック
    • を強制します。

    次に、CATCHブロックにエラーを記録するだけです。ここ

    例(独自のログを追加することができます):Nested stored procedures containing TRY CATCH ROLLBACK pattern?

    は個人的に、私はテーブル変数を使用するよりも、このよりエレガント見つけます。

    +0

    これが機能するかどうかわからない)。私はまた、すべてのステップ(および期間)についての情報メッセージをログテーブルに記録したい。次に、エラーの場合の最後の成功したステップをトレースすることもできます。あなたはそれを数えましたか? – Koen

    +0

    @Koen:CATCHブロックで読み込まれる各ステートメントの前に設定された2つの変数を使用することができます – gbn

    +0

    これは私がちょうど両方の答えのコンボを実装した理由を知りたいと思います。 .. – Koen

    関連する問題