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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM