8

のBooksOnlineのドキュメントにSET XACT_ABORT ON基づくと、T-SQLステートメントで実行時エラーが発生した場合、トランザクション全体が終了してロールバックされるという印象を受けます。

備考

SET XACT_ABORTがONのときに、Transact-SQLステートメントで実行時エラーが発生すると、トランザクション全体が終了してロールバックされます。

SQL Server 2008 R2でこれをテストする:

SET XACT_ABORT ON;
BEGIN TRANSACTION;
PRINT 'TranCount befor an error = '+CAST(@@Trancount AS varchar(50))

DROP TABLE QuertyAsdf

PRINT 'TranCount after an error = '+CAST(@@Trancount AS varchar(50))

出力を提供します:

TranCount befor an error = 1
Msg 3701, Level 11, State 5, Line 6
Cannot drop the table 'QwertyAsdf', because it does not exist or you do not have permission.
TranCount after an error = 1

SET XACT_ABORT ON私はまた、エラーが発生した場合にバッチを終了するという印象を受けました:

SET XACT_ABORT ONは、SQL Serverに、トランザクション全体をロールバックし、実行時エラーが発生したときにバッチを中止するように指示します。

それは便利に聞こえます。どうすればそれを行うことができますか?

4

2 に答える 2

5

SQL Server は、重大度レベルが 16 以上の場合にのみトランザクションをロールバックします。

例を参照してください:

Msg 544, Level 16, State 1, Line 1
Cannot insert explicit value for identity column in table 'ORC_ORCAMENTO' whenIDENTITY_INSERT is set to OFF.

SQL Server 2008 R2 でのテスト

SET XACT_ABORT ON;
BEGIN TRANSACTION;
PRINT 'TranCount befor an error = '+CAST(@@Trancount AS varchar(50))
insert into ORC_ORCAMENTO (ORCID, ORCNOME, ORCATIVO) VALUES (1, 'TESTE_ALEXP', 0);
PRINT 'TranCount after an error = '+CAST(@@Trancount AS varchar(50))

戻り値

TranCount befor an error = 1
Msg 544, Level 16, State 1, Line 5
Cannot insert explicit value for identity column in table 'ORC_ORCAMENTO' when IDENTITY_INSERT is set to OFF.
TranCount after an error = 0

の Microsoft エラー メッセージ レベルを参照してください。

https://docs.microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-events-and-errors

于 2012-08-14T16:58:50.603 に答える
1

ステートメントで xact abort on を使用すると、try catch手動でエラーを発生させてトランザクションをロールバックさせることができます。

set xact_abort on;

begin try
    ...dml statements here....

if conditions here...
    raiseerror(....);

end try
begin catch

end catch
于 2012-11-14T17:16:36.080 に答える