大多數迭代語言編譯器都有內置的錯誤處理程序(例如,TRY…CATCH語句),開發者們在設計代碼的時候可以利用它們。雖然SQL Server 2000的開發者不能夠像迭代語言的開發者那樣利用內置的工具,但是他們可以用系統變量@@ERROR來設計自己有效的錯誤處理工具。
引入事務
為了能夠掌握在SQL Server 2000中錯誤處理是如何工作的,你必須首先要理解數據庫事務的概念。在數據庫術語中,事務就是指作為一個單獨的工作單位出現的一系列語句。舉個例子來說,假設你有三個語句要執行,事務就可以這樣被設計,要麼所有三個語句都成功發生,否則就一個都不發生。
在SQL Server中執行數據處理操作時,操作是在緩沖存儲器中發生的,並不是立即被寫入實際的表格中。然後,當SQL Server運行CHECKPOINT進程時,已經發生的變化才被寫入磁盤。這也就意味著,在事務發生的過程中,變化並不被寫入磁盤,直到它被提交了,才會被寫入。運行時間較長的事務需要更多的處理存儲空間,需要數據庫保持更長時間的鎖定。所以當你在工作環境中設計運行時間長的事務時,一定要小心。
下面是一個很好的例子,說明了利用事務的好處。從ATM中取錢需要以下幾個步驟:輸入一個PIN號碼,選擇一個帳戶類型和輸入你想要提取的資金的金額。如果你試圖從ATM中取出50美元,然後操作失敗,你肯定不願意在沒有拿到錢的情況下被扣除50美元。事務就可以被用來保證這種一致性。
SQL Server 2000中成功的錯誤處理需要始終如一地檢查系統變量@@ERROR 的值。@@ERROR是指在所有語句在給定的連接下,在服務器上被執行以後,由SQL Server數據庫引擎更新的一個變量。這個變量中包括了相應的錯誤號碼,如果有的話。你可以在主數據庫的sysmessages表格中找到這些錯誤號碼的列表。關於這個表格的詳細資料在微軟的網站上已經被列出。
下面是一個說明變量@@ERROR如何工作的例子:
PRINT 'Taking a look at @@ERROR'
PRINT @@ERROR
在這些指令中,我們將在屏幕上顯示一個字符串,並輸出變量@@ERROR的值。因為屏幕上輸出的沒有錯誤,所以@@ERROR的值為0。
PRINT 1/0
PRINT @@ERROR
在上面這個例子中,我們發生了用0作除數的錯誤,這樣變量@@ERROR中將包括數字8134,它是微軟給這種錯誤分配的錯誤代號。對於大多數錯誤處理來說,只有當@@ERROR的值不為0時,即顯示有錯誤發生的時候,你才會關注到它。在記錄錯誤的時候,留意每個錯誤號碼不失為一個好辦法,因為這樣的話,在調試過程中,調用它們就很方便了。
工作中的錯誤處理
下面是一個關於怎樣在存儲過程中利用錯誤處理的例子。示例腳本的目的是要執行一個存儲過程,定義一個事務,然後在一個表格中插入一條記錄。因為只是為了解釋說明的目的,所以我們用以下的方式設計該程序,這樣就可以知道到底是提交還是重新運行該項事務。
執行下面的語句來創建我們在例子將要用到的表格:
CREATE TABLE Transactions
(
TranID SMALLINT IDENTITY(1,1) PRIMARY KEY,
EntryDate SMALLDATETIME DEFAULT(GETDATE()),
ParamValue CHAR(1),
ThrowError BIT
)