1、SQLServer數據庫引擎錯誤
一、查詢系統錯誤信息
SQLServer在每一個數據庫的系統視圖sys.messages中存儲系統自定義(Message_id <= 50000)和用戶自定義(Message_id>50000)錯誤消息。數據庫
二、系統錯誤信息的嚴重性級別
獲得的系統錯誤消息分爲不一樣程度的嚴重性級別。嚴重性級別是經過數字來表示的,數字越小表示嚴重級別越低。反之則嚴重性越高。嚴重性較高的錯誤指示須要儘快解決問題。函數
2、用try...catch發現錯誤
try...catch結構 spa
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塊中的錯誤信息。
3、捕獲錯誤的系統函數
- 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
輸出結果如圖所示:code
4、用@@ERROR捕獲上一條語句的錯誤
T-SQL還提供了一個簡單的系統函數@@ERROR來捕獲上一條語句的錯誤。若是上一條語句執行成功。@@ERROR系統函數將返回0;若是上一條語句生成錯誤, @@ERROR將返回錯誤號。對象
每條語句完成時@@ERROR都會更改。blog
例如:ci
select 1/0
select * from sys.messages where message_id = @@error and language_id = 2052
結果如圖:字符串
5、用RAISERROR反饋錯誤
功能:
將生成的SQLServer引擎錯誤或警告信息(從sys.messages系統視圖得到)反饋到應用程序中。sys.messages系統視圖中由SQLServer自身定義的信息,其 message_id列的值小於等於5000。it
返回用戶使用存儲過程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,不用考慮嚴重級別。