1

主キー違反エラーが発生する主キー列に重複する値を挿入しようとしています。このエラーを catch ブロック内に記録したいと思います。

コードブロック :-

   SET XACT_ABORT OFF
   BEGIN TRY
   BEGIN TRAN
   INSERT INTO #Calender values (9,'Oct')
   INSERT INTO #Calender values (2,'Unknown')
   COMMIT TRAN
   END TRY

  BEGIN CATCH 
  Insert into #LogError values (1,'Error while inserting a duplicate value')
  if @@TRANCOUNT >0
  rollback tran
  raiserror('Error while inserting a duplicate value ',16,20)
  END CATCH

上記のコードを実行すると、catch ブロックに表示されるカスタム エラー メッセージが出力されますが、#LogError テーブルには値が挿入されません。

Error while inserting a duplicate value

しかし、SET XACT_ABORT ON を使用すると、別のエラー メッセージが表示されますが、それでもエラー メッセージがテーブルに挿入されません。

 The current transaction cannot be committed and cannot support operations
 that write to the log file. Roll back the transaction.

私の質問は

1.テーブルにエラーを記録する方法

2. xact_ABORT をオンに設定すると、異なるエラー メッセージが表示されるのはなぜですか。すべてのトランザクションの前に XACT_ABORT をオンに設定することをお勧めします

4

2 に答える 2

2

レコードを挿入し#LogErrorますが、それを削除するトランザクションをロールバックします。

ロールバックの後に挿入するか、代わりにテーブル変数に挿入する必要があります (ロールバックの影響を受けません)。

try ブロックでエラーが発生すると、トランザクションが失敗した状態になる可能性があります。ログへの書き込みやコミットを試みる前に、catch ブロックでXACT_STATE()(トピックの例 c を参照TRY ... CATCH)の値をテストして、これを確認する必要があります。

XACT_ABORTtry ブロックで重大度が 10 を超えるエラーが発生すると、この効果が発生します。

于 2012-06-10T10:29:03.067 に答える