エラーが発生すると、トランザクションは自動的にロールバックされ、現在のバッチは中止されます。
ただし、実行は次のバッチに続きます。したがって、エラーが実行された後のバッチ内のすべてのもの。その後、後でエラーをチェックするときに、既にロールバックされたトランザクションをロールバックしようとします。
また、現在のバッチだけでなく、スクリプト全体を停止するには、次を使用する必要があります:
raiserror('Error description here', 20, -1) with log
を参照してください。私の答えはこちら その詳細については。
したがって、 @error
を確認する必要があります 各バッチの後、次のようなことがうまくいくと思います:
BEGIN TRANSACTION
GO
ALTER Stuff
GO
if @@error != 0 raiserror('Script failed', 20, -1) with log
GO
CREATE New Stuff
GO
if @@error != 0 raiserror('Script failed', 20, -1) with log
GO
DROP Old Stuff
GO
if @@error != 0 raiserror('Script failed', 20, -1) with log
GO
PRINT 'No Errors ... Committing changes'
COMMIT TRANSACTION