天天看點

SQLServer異常捕獲

在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      

日志表如下:

SQLServer異常捕獲

系統日志表如下:

SQLServer異常捕獲

 從上述2個我們卡可以看出,在系統日志表中我們隻可以看到錯誤的資訊,但是不能具體定位到是哪一個具體的存儲過程執行後出現的錯誤。

作者:奔跑的金魚

出處:https://www.cnblogs.com/OliverQin/

聲明:書寫部落格不易,轉載請注明出處,請支援原創,侵權将追究法律責任

個性簽名:人的一切的痛苦,本質上都是對自己無能的憤怒

如果覺得這篇文章對你有小小的幫助的話,記得在右下角點個“推薦”哦,部落客在此感謝!

繼續閱讀