Когато възникне грешката, транзакцията се връща автоматично и текущата партида се прекъсва.
Изпълнението обаче продължава в следващата партида. Така че всички неща в партидите след грешката се изпълняват. И след това, когато проверявате за грешки по-късно, вие се опитвате да върнете вече отменена транзакция.
Освен това, за да спрете целия скрипт, а не само текущия пакет, трябва да използвате:
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