2009-03-20 10 views
1

最後にSQLのこのバッチをロールバックトランザクションの部分に取得するにはどうすればよいですか? SQLは、悪いコード行でスクリプトの実行を停止するだけです。私はtry/catch構造体を使うことができると知っていますが、SQLがtry/catchを追加する前にこれがどのように処理されたかにもっと関心があります。SQL Serverバッチエラー処理の問題

BEGIN TRAN 

CREATE TABLE TempTable (c1 INT NULL) 

INSERT INTO TempTable (c1) SELECT 1 

INSERT INTO TempTable (c1) SELECT 'ABS' 

IF (@@ERROR = 0) 
BEGIN 
    PRINT 'no error' 
    COMMIT TRAN 
END 
    ELSE 
BEGIN 
    PRINT 'error' -- Why does it never get here??????? 
    ROLLBACK TRAN 
END 

答えて

8

この場合、「ABS」はCASTエラーであるため、バッチ処理が中止されます。 ここで説明します。Erland Sommarskog's excellent article

この記事を読む必要があります。 SQLエラーハンドリングについて今まで以上に知る必要があったこと。

また、各ステートメントをテストする必要があります。最初のINSERTが失敗した場合は、XACT_ABORT ONを持っていない限り、あなたはまだ(実行を続けていくと思います。

BEGIN TRAN 

CREATE TABLE TempTable (c1 INT NULL) 

INSERT INTO TempTable (c1) SELECT 1 
IF @@ERROR <> 0 
    GOTO errhandler 

INSERT INTO TempTable (c1) SELECT 'ABS' 
IF @@ERROR <> 0 
    GOTO errhandler 

PRINT 'no error' 
COMMIT TRAN 
GOTO exitpoint 

errhandler: 
PRINT 'error' -- Why does it never get here??????? 
ROLLBACK TRAN 

exitpoint: 

SQL Server 2000を持っている場合はより多くのチェックを追加する場合を除き、あなたは多くのオプションを持っていない、ISNUMERICなど

SQL Server 2005を持っている場合は、あなたが本当に新しい技術を使用する必要がありますほとんどすべてのコードと実行エラーがきれいにキャッチされ

BEGIN TRY 
    BEGIN TRAN 

    CREATE TABLE TempTable (c1 INT NULL) 

    INSERT INTO TempTable (c1) SELECT 1 

    INSERT INTO TempTable (c1) SELECT 'ABS' 

    PRINT 'no error' 
    COMMIT TRAN 
END TRY 
BEGIN CATCH 
    PRINT 'error' --It will get here for SQL 2005 
    ROLLBACK TRAN 
END CATCH 
+0

1:。。。良い明確かつ簡潔な答えを –

+0

+1徹底的な対応をありがとう! – James