大多數迭代語言編譯器都有內建的錯誤處理程式(例如,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
)