私はSQLServer 2014を使用していますが、IDとvarcharカラムdataを持つ1つのテーブルを持つ単純なデータベースを持っています。SP_ExecuteSQLを使用するとトランザクションが中断される
SET XACT_ABORT ON
BEGIN TRANSACTION
exec sp_executesql N'some nonsense'
insert into testTable values ('b')
COMMIT
SSMSは私がsp_executesql
コールで間違ったクエリを実行しようとしたため、エラーがあったことを示しています。私は、次のステートメントを実行していくつかの奇妙な振る舞いがあります。ただし、1 row(s) affected
も表示されます。 testTableでselectクエリを実行すると、値 'b'が挿入されていることがわかります。
私はTRY/CATCH
ブロック内のステートメントをラップした場合、すべてが期待どおりに動作し、トランザクション全体のアクションがロールバックされます。何かが行く場合
BEGIN TRANSACTION
BEGIN TRY
exec sp_executesql N'some nonsense'
insert into testTable values ('b')
COMMIT
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
ROLLBACK
END CATCH
はSET XACT_ABORT ON
は、トランザクション全体がロールバックされることを保証すべきではありません違う?私は行方不明の設定はありますか?
おかげ
「何かナンセンス」に依存するように見えますが、コンパイル時エラーの場合は、あなたが言うように動作します。実行時エラー( 'exec sp_executesql N'SELECT 1/0 ''のような)の場合、それはあなたが望むように動作します。 –
これは違いがあるかどうかは分かりませんでした。私は構文エラーがあり、それはそれを説明するでしょう。しかし、なぜこれを行うのかを説明するいくつかの文書がありますか?コンパイル時にエラーが発生しても、トランザクション全体がロールバックされるとは思っています。または、XACT_ABORTオプションはランタイムエラーのみを処理しますか? – Pinetree
私はこれまでこれを知らなかった。私はそれが「設計上」であるかどうかわからない。 –