/* SQLServer異常捕獲 在SQLserver數據庫中,若是有不少存儲過程的時候,咱們會使用動態SQL進行存儲過程調用存儲過程,這時候,極可能在某個環節就出錯了,可是出錯了咱們很難去跟蹤到出錯的存儲過程,此時咱們就能夠使用異常處理,經過日誌表來記錄存儲過程的執行狀況,然而定位到錯誤的存儲過程,如下是一個存儲過程異常處理的小實例: */ /*===================================================== 相關錯誤消 息以下: ERROR_NUMBER() 返回錯誤號。 ERROR_SEVERITY() 返回嚴重性。 ERROR_STATE() 返回錯誤狀態號。 ERROR_PROCEDURE() 返回出現錯誤的存儲過程或 觸發器的名稱。 ERROR_LINE() 返回致使錯誤的例程中的行 號。 ERROR_MESSAGE() 返回錯誤消息的完整文本。 ========================================================*/ CREATE TABLE #LogTable /*能夠建一個實體表來保存錯誤的信息*/ ( ID int identity(1,1),--錯誤序號 ErrorNumber int,--錯誤號 ErrorSeverity int,--嚴重性 ErrorState int,--錯誤狀態號 ErrorProducure varchar(200),--出現錯誤的存儲過程或 觸發器的名稱 ErrorLine int,--致使錯誤的例程中的行號 ErrorMessage varchar(200)--錯誤消息的完整文本 ) --===============除數不爲0的異常捕獲=================-- IF EXISTS ( SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'TestTryCatch') AND xtype = 'P' ) DROP PROC TestTryCatch; GO CREATE TABLE #Department ( DeptID VARCHAR(20) PRIMARY KEY, DeptName NVARCHAR(50) ) GO DELETE FROM #Department CREATE PROC TestTryCatch AS BEGIN BEGIN TRY --開始捕捉異常 BEGIN TRAN; --開始事務 INSERT INTO #Department ( DeptID, DeptName ) VALUES ( 'D0001', N'人力資源TEAM') /* 不加事務, 每一句就是一個事務, 數據插入#Department中,以後不會再回滾。 */ PRINT 'Before Error' SELECT 1 / 0; -- 業務處理段 PRINT 'After Error' /* 不管加不加事務, 錯誤以後的語句都再也不執行 */ INSERT INTO #Department ( DeptID, DeptName ) VALUES ( 'D0002', N'財務TEAM') COMMIT TRAN; --提交事務 END TRY --結束捕捉異常 BEGIN CATCH --有異常被捕獲 IF @@TRANCOUNT > 0 --判斷有沒有事務 BEGIN ROLLBACK TRAN; --回滾事務 END; DECLARE @ErrorMsg NVARCHAR(MAX); SELECT @ErrorMsg = ERROR_MESSAGE(); RAISERROR(@ErrorMsg,16,1); INSERT INTO #LogTable VALUES ( ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE() ); END CATCH; --結束異常處理 END --執行存儲過程 EXEC TestTryCatch; --查看日誌表 SELECT * FROM #LogTable; --查看系統日誌表 SELECT * FROM sys.messages WHERE message_id = 8134 AND language_id = 2052; --查看系統的messages表 SELECT * FROM sys.messages WHERE language_id = 2052 ORDER BY message_id;