SQLServer异常捕获(Try Catch)与回滚

 

SQLServer异常捕获(Try Catch)与回滚

 

  1 /*
  2 SQLServer异常捕获
  3  
  4 在SQLserver数据库中,如果有很多存储过程的时候,我们会使用动态SQL进行存储过程调用存储过程,这时候,很可能在某个环节就出错了,但是出错了我们很难去跟踪到出错的存储过程,此时我们就可以使用异常处理,通过日志表来记录存储过程的执行情况,然而定位到错误的存储过程,以下是一个存储过程异常处理的小实例:
  5  
  6 */
  7  
  8 /*=====================================================
  9 相关错误消 息如下:
 10  
 11 ERROR_NUMBER() 返回错误号。
 12  
 13 ERROR_SEVERITY() 返回严重性。
 14  
 15 ERROR_STATE() 返回错误状态号。
 16  
 17 ERROR_PROCEDURE() 返回出现错误的存储过程或 触发器的名称。
 18  
 19 ERROR_LINE() 返回导致错误的例程中的行 号。
 20  
 21 ERROR_MESSAGE() 返回错误消息的完整文本。
 22 ========================================================*/
 23  
 24 CREATE TABLE #LogTable  /*可以建一个实体表来保存错误的信息*/
 25 (
 26   ID              int identity(1,1),--错误序号
 27   ErrorNumber     int,--错误号
 28   ErrorSeverity   int,--严重性
 29   ErrorState      int,--错误状态号
 30   ErrorProducure  varchar(200),--出现错误的存储过程或 触发器的名称
 31   ErrorLine       int,--导致错误的例程中的行号
 32   ErrorMessage    varchar(200)--错误消息的完整文本
 33 )
 34  
 35 --===============除数不为0的异常捕获=================--
 36 IF EXISTS ( SELECT  *
 37             FROM    sysobjects
 38             WHERE   id = OBJECT_ID(N'TestTryCatch')
 39                     AND xtype = 'P' )
 40     DROP PROC TestTryCatch;
 41 GO
 42  
 43 CREATE TABLE #Department
 44 (
 45     DeptID VARCHAR(20) PRIMARY KEY,
 46     DeptName NVARCHAR(50)
 47 )
 48 GO
 49  
 50 DELETE FROM #Department
 51  
 52 CREATE PROC TestTryCatch
 53 AS
 54 BEGIN
 55     BEGIN TRY                   --开始捕捉异常
 56         BEGIN TRAN;             --开始事务
 57  
 58         INSERT INTO #Department ( DeptID, DeptName )   
 59         VALUES  ( 'D0001', N'人力资源TEAM')          
 60         /*
 61              不加事务, 每一句就是一个事务,
 62              数据插入#Department中,之后不会再回滚。     
 63         */
 64  
 65         PRINT 'Before Error'       
 66  
 67         SELECT  1 / 0;          -- 业务处理段   
 68          
 69         PRINT 'After Error'    
 70  
 71         /* 无论加不加事务, 错误之后的语句都不再执行 */
 72         INSERT INTO #Department ( DeptID, DeptName )   
 73         VALUES  ( 'D0002', N'财务TEAM')  
 74          
 75         COMMIT TRAN;            --提交事务
 76     END TRY                     --结束捕捉异常
 77     BEGIN CATCH                 --有异常被捕获
 78         IF @@TRANCOUNT > 0       --判断有没有事务
 79             BEGIN
 80                 ROLLBACK TRAN;  --回滚事务
 81             END;
 82      
 83         DECLARE @ErrorMsg NVARCHAR(MAX);
 84         SELECT  @ErrorMsg = ERROR_MESSAGE();
 85         RAISERROR(@ErrorMsg,16,1);
 86  
 87         INSERT  INTO #LogTable
 88         VALUES  ( ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE() );
 89  
 90     END CATCH;                  --结束异常处理
 91 END
 92  
 93 --执行存储过程
 94 EXEC TestTryCatch;
 95  
 96 --查看日志表
 97 SELECT  *
 98 FROM    #LogTable;
 99  
100 --查看系统日志表
101 SELECT  *
102 FROM    sys.messages
103 WHERE   message_id = 8134
104         AND language_id = 2052;
105  
106 --查看系统的messages表
107 SELECT  *
108 FROM    sys.messages
109 WHERE   language_id = 2052
110 ORDER BY message_id;

 

posted @ 2022-02-18 16:05  亟待!  阅读(1177)  评论(0编辑  收藏  举报
……