SQL Server 2005 引入三大里程碑功能:XML 原生資料類型、TRY/CATCH 結構化異常處理、DDL 觸發器。本文透過問答形式,深入剖析這些功能的核心觀念、語法差異與實務應用。
| 特性 | 非類型化 XML | 類型化 XML |
|---|---|---|
| 定義語法 | CREATE TABLE T (X XML) | CREATE TABLE T (X XML(SchemaName)) |
| 結構驗證 | 僅檢查 Well-formed | 依 XSD Schema 驗證結構、資料型別、必要欄位 |
| 儲存方式 | 以字串形式儲存 | 依 Schema 最佳化二進位儲存 |
| 查詢效能 | 需執行階段剖析、型別轉換 | 編譯期已知結構,索引效能優 |
| 適用情境 | Schema 不固定、多來源整合 | Schema 穩定、企業應用整合、高效能查詢 |
-- T-SQL 建立
CREATE XML SCHEMA COLLECTION HRResumeSchema AS N'
'
-- 使用於資料表
CREATE TABLE JobCandidate (
CandidateID INT PRIMARY KEY,
Resume XML(HRResumeSchema) -- 類型化 XML 欄位
)
-- SQL Server 2000 風格:每句必檢查
BEGIN TRANSACTION
DELETE [Order Details] WHERE OrderID IN (SELECT OrderID FROM Orders WHERE CustomerID = 'ALFKI')
IF @@ERROR <> 0 BEGIN ROLLBACK TRANSACTION; RETURN END
DELETE Orders WHERE CustomerID = 'ALFKI'
IF @@ERROR <> 0 BEGIN ROLLBACK TRANSACTION; RETURN END
DELETE Customers WHERE CustomerID = 'ALFKI'
IF @@ERROR <> 0 BEGIN ROLLBACK TRANSACTION; RETURN END
COMMIT TRANSACTION
缺點:程式碼冗長、易漏檢、@@ERROR 易被後續陳述式覆蓋、嚴重錯誤(Severity ≥ 20)會中斷批次導致無法捕捉。
BEGIN TRY
BEGIN TRANSACTION
DELETE [Order Details] WHERE OrderID IN (SELECT OrderID FROM Orders WHERE CustomerID = 'ALFKI')
DELETE Orders WHERE CustomerID = 'ALFKI'
DELETE Customers WHERE CustomerID = 'ALFKI'
PRINT 'committing deletes'
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
-- 取得錯誤詳細資訊
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage
RETURN
END CATCH
| 特性 | @@ERROR | TRY/CATCH |
|---|---|---|
| 程式碼行數 | O(N) 每句檢查 | O(1) 區塊包裹 |
| 錯誤資訊豐富度 | 僅錯誤號 | 6 種內建函數完整資訊 |
| 捕捉範圍 | 單一陳述式 | 整個區塊(Severity 11-19) |
| 嚴重錯誤處理 | 無法捕捉 | 若不導致引擎停止可捕捉 |
| 可讀性/維護性 | 差 | 優 |
CREATE TRIGGER ddlTrigger_ProcNamingConvention
ON DATABASE
AFTER CREATE_PROCEDURE, ALTER_PROCEDURE
AS
BEGIN
DECLARE @eventData XML = EVENTDATA()
DECLARE @objName NVARCHAR(200) = @eventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(200)')
IF LEFT(@objName, 2) <> 'pr'
BEGIN
PRINT '預存程序必須以 "pr" 開頭:' + @objName
ROLLBACK TRANSACTION
END
END
DDL 觸發器同步執行,避免在觸發器中執行耗時操作(如寄信、跨伺服器查詢)。若需非同步處理,請使用 Service Broker + Event Notifications。
SQL Server 2005 的三大新功能——XML 原生支援、TRY/CATCH、DDL 觸發器——奠定了現代資料庫開發的基石。掌握類型化 XML 的效能優勢、結構化異常處理的最佳實務、以及 DDL 觸發器的稽核能力,能顯著提升系統的健壯度與維護性。