Ketika kesalahan terjadi, transaksi dibatalkan secara otomatis, dan batch saat ini dibatalkan.
Namun, eksekusi berlanjut ke batch berikutnya. Jadi semua barang dalam batch setelah kesalahan dieksekusi. Dan kemudian ketika Anda memeriksa kesalahan nanti, Anda mencoba mengembalikan transaksi yang sudah dibatalkan.
Juga, untuk menghentikan seluruh skrip, bukan hanya kumpulan saat ini, Anda harus menggunakan:
raiserror('Error description here', 20, -1) with log
Lihat jawaban saya di sini untuk detail tentang itu.
Jadi, Anda perlu memeriksa @error
setelah setiap batch, saya pikir sesuatu seperti ini akan berfungsi:
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