Wanneer de fout optreedt, wordt de transactie automatisch teruggedraaid en wordt de huidige batch afgebroken.
De uitvoering gaat echter door in de volgende batch. Dus alle dingen in de batches nadat de fout is uitgevoerd. En als u later op fouten controleert, probeert u een reeds teruggedraaide transactie terug te draaien.
Om het hele script te stoppen, niet alleen de huidige batch, moet je ook het volgende gebruiken:
raiserror('Error description here', 20, -1) with log
Zie mijn antwoord hier voor details hierover.
U moet dus controleren op @error
na elke batch denk ik dat zoiets als dit zou moeten werken:
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