SQLServer異常捕獲(Try Catch)

/*
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;
相關文章
相關標籤/搜索