在SQLserver數據庫中,如果有很多存儲過程的時候,我們會使用動態SQL進行存儲過程調用存儲過程,這時候,很可能在某個環節就出錯了,但是出錯了我們很難去跟蹤到出錯的存儲過程,此時我們就可以使用異常處理,通過日志表來記錄存儲過程的執行情況,然而定位到錯誤的存儲過程,以下是一個存儲過程異常處理的小實例:
CREATE DATABASE TEST
USE TEST
/*=====================================================
相關錯誤消 息如下:
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'getWrong') AND xtype='P')
DROP PROC getWrong
go
CREATE PROC getWrong
AS
BEGIN
-----------------制造異常
BEGIN TRY
SELECT 1/0;
-----------------捕獲異常
END TRY
BEGIN CATCH
INSERT INTO LogTable values(ERROR_NUMBER(),ERROR_SEVERITY(),ERROR_STATE(),ERROR_PROCEDURE(), ERROR_LINE() ,ERROR_MESSAGE())
END CATCH
END
--執行存儲過程
EXEC getWrong
--查看日志表
select * from LogTable
--查看系統日志表
SELECT * FROM sys.messages WHERE message_id=8134 AND language_id=2052
日志表如下:

系統日志表如下:
從上述2個我們卡可以看出,在系統日志表中我們只可以看到錯誤的信息,但是不能具體定位到是哪一個具體的存儲過程執行后出現的錯誤。

