淺談在SQL Server2005中進行錯誤捕捉(3)_Mssql數據庫教程
推薦:解析SQL Server 2000 SP4與數據鏈接池問題今天遠程連接一臺xp sp2上的SQL,報錯信息如下: 以下為引用的內容: Timeout expired. The timeout period elapsed prior to obtaining
基于上述原因,RAISERROR不僅可以根據錯誤代碼拋出錯誤信息,也可以直接通過錯誤描述格式字符串拋出錯誤信息。
RAISERROR(’sql遇到了一個錯誤(%s)’, 16, 1, ’測試’)
二、邏輯錯誤的捕捉
在實際應用中,更多的是由于某些業務要求而產生的邏輯錯誤。這些錯誤無法通過@@ERROR進行捕捉。如果使用客戶端代碼進行捕捉,那么Transact-SQL必須一條一條地執行。如果使用存儲過程,那么發生在存儲過程內部的邏輯錯誤就很難在客戶端代碼中進行捕捉,因此,下面將討論如何使用Transact-SQL捕捉邏輯錯誤。
所謂邏輯錯誤,就是在執行完Transact-SQL后,執行結果與業務要求的結果不符而產生的。為了說明如何處理邏輯錯誤,我們再建立一個表table2,這個表的結構和table1完全一樣,只是f1字段不再是主鍵了。然后建立一個存儲過程,它的功能是在table1和table2中同時插入一條記錄,但是這條記錄必須滿足兩個條件。
1、f1值不能大于100。
2、要插入的記錄在table1中不存在,如果存在,在table1和table2中都不插入這條記錄。
| 以下為引用的內容:
createPROCEDUREp1(@Numint)ASDECLARE@Errorint,@RowcountintBEGINTRANSACTIONinsertINTOtable2VALUES(@Num,’p’)IF@Num>100BEGINRAISERROR(’%s的值不能大于100。’,16,1,’@Num’) ROLLBACKTRANSACTIONRETURN1ENDELSEBEGINselectf1FROMtable1wheref1=@NumIF@@ROWcount>0BEGINRAISERROR(’table1中已經存在%d了。’,16,1,@Num)ROLLBACKTRANSACTIONRETURN2ENDELSEBEGINinsertINTOtable1VALUES(@Num,’p’)COMMITTRANSACTIONRETURN0ENDEND |
在這個存儲過程中一開始使用BEGIN TRANSACTION顯示地開始一個事務,然后當上述兩種錯誤發生時使用ROLLBACK TRANSACTION恢復到初始狀態,如果成功插入,使用COMMIT TRANSACTION提交改變。可以通過如下語句進行調用。
| 以下為引用的內容:
exec @ErrNUm = p1 2 PRINT @ErrNum |
可以通過@ErrNum得到p1返回的錯誤代碼,如果返回0,表示執行成功。
SQL Server2005中錯誤捕捉的新功能
雖然在以前的SQL Server版本中可以通過一些技巧實現錯誤捕捉,但有時需要增加一些額外的開銷,如在p1中使用了select語句。慶幸的是在SQL Server2005中提供了和大多數編程語言類似的try...catch錯誤捕捉功能,從而使Transact-SQL第一次可以真正地進行錯誤捕捉。使用try...catch可以將p1的下半部分改寫為如下形式。
ELSEBEGINBEGINTRYinsertINTOtable1VALUES(@Num,’p’) COMMITTRANSACTIONRETURN0ENDTRYBEGINCATchrAISERROR(’table1中已經存在%d了。’,16,1,@Num)ROLLBACKTRANSACTIONRETURN2ENDCATCHEND
可以看出,這個改寫的部分未使用select查詢table1中是否已經有了某條記錄,而是通過數據庫的約束來進行判斷的。如果鍵值沖突,就產生了錯誤,這樣SQL語句就直接跳到BEGIN CATCH中執行錯誤處理代碼。這樣做效率要比上一個版本高得多,而且如果將RAISERROR去掉,p1就不會拋出任何錯誤,只是返回了一個錯誤碼,這樣有利于客戶端代碼進行處理。
在Transact-SQL中進行錯誤捕捉,如果使用的是SQL Server2005,我的建議是盡量使用try...catch,因此它會捕捉到未預料到的錯誤,并且會使Transact-SQL更容易維護。當然,這樣做就無法將Transact-SQL移植到SQL Server2000或更低的版本上運行,要是想寫通用的Transact-SQL,還是使用傳統的方法捕捉錯誤吧!
分享:解析SQL Server 2008對T-SQL語言的增強Microsoft SQL Server 2008 對 T-SQL 語言進行了進一步增強。為了讓開發人員盡快了解這些變化,我們針對 2007 年 6 月 CTP 版本的 SQL Server 2008 中的 T-SQL 語言的新增功能進行
- sql 語句練習與答案
- 深入C++ string.find()函數的用法總結
- SQL Server中刪除重復數據的幾個方法
- sql刪除重復數據的詳細方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數據庫,提示 無法為該請求檢索數據 錯誤916解決方法
- SQLServer日志清空語句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲過程參數的用法實例詳解
- 相關鏈接:
- 教程說明:
Mssql數據庫教程-淺談在SQL Server2005中進行錯誤捕捉(3)
。