Når fejlen opstår, rulles transaktionen automatisk tilbage, og den aktuelle batch afbrydes.
Udførelsen fortsætter dog i næste batch. Så alle tingene i batchene efter fejlen bliver udført. Og så når du tjekker for fejl senere, forsøger du at rulle tilbage en allerede tilbageført transaktion.
For at stoppe hele scriptet, ikke kun den aktuelle batch, skal du bruge:
raiserror('Error description here', 20, -1) with log
Se mit svar her for detaljer om den.
Så du skal tjekke efter @error
efter hver batch tror jeg, at noget som dette burde virke:
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