首頁 > 軟體

SQL Server中實現錯誤處理

2022-05-21 16:00:04

一、SQLServer資料庫引擎錯誤

1、查詢系統錯誤資訊

SQLServer在每個資料庫的系統檢視sys.messages中儲存系統自定義(Message_id <= 50000)和使用者自定義(Message_id>50000)錯誤訊息。

2、系統錯誤資訊的嚴重性級別

得到的系統錯誤訊息分為不同程度的嚴重性級別。嚴重性級別是通過數位來表示的,數位越小表示嚴重級別越低。反之則嚴重性越高。嚴重性較高的錯誤指示需要儘快解決問題。

二、用try...catch發現錯誤

try...catch結構       

begin try
        要執行的T-SQL程式碼,一旦錯誤將傳遞給catch塊進行處理
      end try
      begin catch
        檢索和處理錯誤資訊的程式碼
      end catch
      正常執行的T-SQL語句
  • try:其中,try塊是包含在begin try和end try之間的T-SQL程式碼段,在該程式碼段中一旦發生錯誤將傳遞給catch塊,如果沒有錯誤將直接執行catch塊後面的程式碼。
  • catch:catch塊是包含在begin catch和end catch之間的T-SQL程式碼段,在該程式碼段中檢索和處理try塊中的錯誤資訊。

三、捕獲錯誤的系統函數

  • error_number()
    返回錯誤的ID號,對應sys.messages系統檢視中的message_id欄位。
  • error_line()
    返回T-SQL程式碼中錯誤出現的語句行數。
  • error_message()
    返回將返回給應用程式的訊息文字。該文字包括為所有可替換引數提供的值,如長度、物件名或時間。對應sys.messages系統檢視中的text欄位。
  • error_procedure()
    返回出現錯誤的儲存過程或觸發器名稱。如果在儲存過程或觸發器中未出現錯誤,該函數返回NULL。
  • error_severity()
    返回錯誤的嚴重性級別。對應sys.messages系統檢視中的severity欄位。
  • error_state()
    返回狀態

 範例:

begin try
    select 1/0
end try
begin catch
    select 
        error_number() as 'number',
        error_line() as 'line',
        error_message() as 'message',
        error_severity() as 'severity',
        error_state()    as 'state'
end catch

輸出結果如圖所示:

四、用@@ERROR捕獲上一條語句的錯誤

T-SQL還提供了一個簡單的系統函數@@ERROR來捕獲上一條語句的錯誤。如果上一條語句執行成功。@@ERROR系統函數將返回0;如果上一條語句生成錯誤,@@ERROR將返回錯誤號。

每條語句完成時@@ERROR都會更改。

例如:

select 1/0
select * from sys.messages where message_id = @@error and language_id = 2052

 結果如圖:

五、用RAISERROR反饋錯誤

功能:

將生成的SQLServer引擎錯誤或警告資訊(從sys.messages系統檢視獲得)反饋到應用程式中。sys.messages系統檢視中由SQLServer自身定義的資訊,其message_id列的值小於等於5000。

返回使用者使用儲存過程sp_addmessage建立的自定義訊息(儲存在系統檢視sys.messages中,其message_id大於50000)。

與print語句的區別:

print語句是T-SQL提供的用於反饋資訊的語句,print語句只能反饋字串或字串表示式的值。

raiserror語句除了print語句的功能外,還支援類似C語言仲printf函數的字串替換功能。這樣可以先在字串中定義要替換的資料的型別和位置,在輸出時自動將字串內容進行替換。

語法: 

raiserror({ msg_id | msg_str | @local_variable })
        { ,severity,state }
         [ ,argument [ ,...n ] ] )
         [ with option [,...n] ]

引數說明:

  • msg_id:儲存在sys.messages系統檢視中的錯誤訊息號(message_id)。如果是使用者使用as_addmessage系統儲存過程自定義的錯誤訊息,其錯誤號應當大於50000.如果未指定msg_id,則返回一個錯誤號為50000的錯誤訊息。
  • msg_str:使用者自定義訊息,msg_str是一個字串,具有可選的嵌入轉換規格。每個轉換規格都會定義參數列中的值。如何格式化並將其置於msg_str中轉換規格位置上的欄位中,轉換規格的格式如下:%[[flag][width][.precision][{h|1}]]type。
  • @local_variable:包含按照msg_str的方式格式化的字串的任何有效字串資料型別的變數。@local_variable的資料型別必須為char或varchar,或者必須能夠隱式轉換為這些資料型別。
  • severity:使用者定義的與該訊息關聯的嚴重級別。當使用msg_id引發使用sp_addmessage建立的使用者定義訊息時,paiserror上指定的嚴重性將覆蓋sp_addmessage中指定的嚴重性。
  • state:狀態號,1至少127之間的任意整數。如果在多個位置引發相同的使用者自定義錯誤,則針對每個位置使用唯一的狀態好有助於找到引發錯誤的程式碼段。
  • argument:用於代替msg_str或對應於msg_id的訊息中的定義的變數的引數。可以有0個或多個替代引數,但是替代引數的總數不能超過20個。
  • option:錯誤的自定義選項。LOG:在SQLServer資料庫引擎範例的錯誤紀錄檔和應用程式紀錄檔中記錄錯誤;NOWAIT:將訊息立即傳送給使用者端;SETERROR:將@@ERROR值和ERROR_NUMBER值設定為msg_id或50000,不用考慮嚴重級別。

到此這篇關於SQL Server中實現錯誤處理的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com