Problème de error handling SQL Server Batch

Comment puis-je get ce lot de SQL pour accéder à la partie Transaction de RollBack à la fin? SQL arrête juste d'arrêter l'exécution du script sur la mauvaise ligne de code. Je sais que je peux utiliser une construction try / catch, mais je suis plus intéressé par la façon dont cela a été traité avant que SQL ne soit ajouté.

BEGIN TRAN CREATE TABLE TempTable (c1 INT NULL) INSERT INTO TempTable (c1) SELECT 1 INSERT INTO TempTable (c1) SELECT 'ABS' IF (@@ERROR = 0) BEGIN PRINT 'no error' COMMIT TRAN END ELSE BEGIN PRINT 'error' -- Why does it never get here??????? ROLLBACK TRAN END 

Dans ce cas, votre 'ABS' est un abandon de lot car il s'agit d'une erreur CAST. Explication ici, à l'excellent article d'Erland Sommarskog

Vous devez lire cet article. Plus que jamais vous avez besoin de savoir sur la gestion des erreurs SQL.

En outre, vous devez tester chaque déclaration. Si le premier INSERT échouait, vous continueriez à l'exécuter (sauf si vous aviez XACT_ABORT ON.

 BEGIN TRAN CREATE TABLE TempTable (c1 INT NULL) INSERT INTO TempTable (c1) SELECT 1 IF @@ERROR <> 0 GOTO errhandler INSERT INTO TempTable (c1) SELECT 'ABS' IF @@ERROR <> 0 GOTO errhandler PRINT 'no error' COMMIT TRAN GOTO exitpoint errhandler: PRINT 'error' -- Why does it never get here??????? ROLLBACK TRAN exitpoint: 

Si vous avez SQL Server 2000 alors vous n'avez pas beaucoup d'options sauf pour append plus de controls, ISNUMERIC etc.

Si vous avez SQL Server 2005, vous devriez vraiment utiliser les nouvelles techniques. Presque toutes les erreurs de code et d'exécution sont détectées proprement.

 BEGIN TRY BEGIN TRAN CREATE TABLE TempTable (c1 INT NULL) INSERT INTO TempTable (c1) SELECT 1 INSERT INTO TempTable (c1) SELECT 'ABS' PRINT 'no error' COMMIT TRAN END TRY BEGIN CATCH PRINT 'error' --It will get here for SQL 2005 ROLLBACK TRAN END CATCH