2

レコードを含むテーブルTable1があります

Table1
-------------------------------
ID  F1
-------------------------------
01  1
02  OK
03  52
04  53
05  Null
------------------------------

ここでは、F1 Varcharのデータ型をDecimal(3,0);に変更します。次に、新しい構造で新しいテーブルを作成します。

varcharを10進数に明示的に変換して、古いテーブルの各レコードを新しいテーブルに挿入したいと思います。だから私はtrycatchブロックでこのコマンドを書いています。エラーが発生した場合、catchブロックでデフォルト値で埋めることができます。ただし、この作業全体は、トランザクションの開始とトランザクションのコミットブロックの間で実行されます。そのため、キャッチブロックでエラーが発生すると、それ以上の作業ができなくなり、エラーが発生します。

現在のトランザクションはコミットできず、ログファイルに書き込む操作をサポートできません。トランザクションをロールバックします。

trycatchブロックでエラーが発生した場合でもこのトランザクションがロールバックされないようにする方法。

4

2 に答える 2

3

それはいけません。常にXACT_STATE を確認し、それに応じて行動する必要があります。

コミット不可能なトランザクションと XACT_STATE
TRY ブロックで生成されたエラーによって現在のトランザクションの状態が無効になった場合、そのトランザクションはコミット不可能なトランザクションとして分類されます。通常、TRY ブロックの外側でトランザクションを終了させるエラーは、TRY ブロックの内側でエラーが発生すると、トランザクションがコミット不能状態になる原因となります。コミット不可能なトランザクションは、読み取り操作または ROLLBACK TRANSACTION のみを実行できます。トランザクションは、書き込み操作または COMMIT TRANSACTION を生成する Transact-SQL ステートメントを実行できません。トランザクションがコミット不可能なトランザクションとして分類されている場合、XACT_STATE 関数は -1 の値を返します。バッチが終了すると、データベース エンジンはコミットできないアクティブなトランザクションをロールバックします。トランザクションがコミット不可能な状態になったときにエラー メッセージが送信されなかった場合、バッチが終了すると、クライアント アプリケーションにエラー メッセージが送信されます。これは、コミットできないトランザクションが検出され、ロールバックされたことを示します。

于 2012-12-27T14:25:47.920 に答える