Lorsque l'erreur se produit, la transaction est annulée automatiquement et le lot en cours est abandonné.
Cependant, l'exécution se poursuit dans le lot suivant. Ainsi, toutes les choses dans les lots après l'exécution de l'erreur. Et puis, lorsque vous recherchez des erreurs plus tard, vous essayez d'annuler une transaction déjà annulée.
De plus, pour arrêter l'intégralité du script, et pas seulement le lot en cours, vous devez utiliser :
raiserror('Error description here', 20, -1) with log
Voir ma réponse ici pour plus de détails sur celui-ci.
Vous devez donc vérifier @error
après chaque lot, je pense que quelque chose comme ça devrait fonctionner :
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