Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Quittez et annulez tout dans le script en cas d'erreur

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