Když dojde k chybě, transakce se automaticky vrátí zpět a aktuální dávka se přeruší.
Provádění však pokračuje do další dávky. Takže všechny věci v dávkách po provedení chyby. A když později zkontrolujete chyby, pokusíte se vrátit zpět již odvolanou transakci.
Chcete-li zastavit celý skript, nejen aktuální dávku, měli byste použít:
raiserror('Error description here', 20, -1) with log
Viz moje odpověď zde podrobnosti o tom.
Musíte tedy zkontrolovat @error
po každé dávce by podle mě mělo fungovat něco takového:
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