XML 作為平台無關的資料表示標準,已成為 B2B 整合、工作流、文件管理的通用語言。SQL Server 2005 引入原生 XML 型別,解決三大核心痛點:
FOR XML RAW/AUTO/EXPLICIT:查詢結果序列化為 XML 串流OPENXML:`sp_xml_preparedocument` → 記憶體 DOM → `SELECT * FROM OPENXML(...)` → `sp_xml_removedocument`-- 未型別 XML
CREATE TABLE T1 (Col1 XML);
-- 型別 XML:綁定結構描述集合
CREATE XML SCHEMA COLLECTION SC AS N'';
CREATE TABLE T2 (Col1 XML(SC));
| 方法 | 語法 | 關鍵限制 |
|---|---|---|
query() | XmlCol.query('xquery_expr') | 回傳 XML 型別,不可直接用於 WHERE |
value() | XmlCol.value('xquery_expr', 'sql_type') | XQuery 必須回傳單一純量,否則報錯 |
exist() | XmlCol.exist('xquery_expr') | 回傳 BIT,適用 WHERE/CHECK 條件 |
nodes() | XmlCol.nodes('xpath') AS T(C) | 配合 CROSS/OUTER APPLY 產生關係資料列 |
modify() | XmlCol.modify('xml_dml') | 僅限 UPDATE SET 子句,隱式交易 |
-- 主要索引 (必須先建立叢集主鍵)
CREATE PRIMARY XML INDEX PXI_T_Col1 ON T(Col1);
-- 次要索引
CREATE XML INDEX SXI_T_Col1_PATH ON T(Col1) USING XML INDEX PXI_T_Col1 FOR PATH;
CREATE XML INDEX SXI_T_Col1_VALUE ON T(Col1) USING XML INDEX PXI_T_Col1 FOR VALUE;
CREATE XML INDEX SXI_T_Col1_PROP ON T(Col1) USING XML INDEX PXI_T_Col1 FOR PROPERTY;
FOR XML PATH('ElementName'):替代 EXPLICIT,支援巢狀屬性/元素控制FOR XML ... TYPE:直接回傳 XML 型別而非串流,可嵌套OPENXML 仍支援,但推薦改用 nodes() + `CROSS APPLY`CREATE TABLE Products (
ProductID INT PRIMARY KEY,
Name NVARCHAR(100),
Attributes XML -- 存放不固定屬性:
);
-- 查詢紅色產品
SELECT Name FROM Products
WHERE Attributes.exist('/Attrs/A[@Key="Color" and @Val="Red"]') = 1;
CREATE TABLE AuditLog (
LogID BIGINT IDENTITY PRIMARY KEY,
EventTime DATETIME2 DEFAULT SYSUTCDATETIME(),
EventType NVARCHAR(50),
Payload XML -- 完整變更前後狀態
);
-- 索引策略:主要索引 + PATH 索引 (常按 EventType/實體 ID 查詢)
| 現狀 | 遷移策略 | 風險/收益 |
|---|---|---|
| SQL 2000 FOR XML EXPLICIT | 改寫為 FOR XML PATH + TYPE | 語法簡化、可嵌套、回傳 XML 型別 |
| OPENXML 切碎載入 | 改用 nodes() + CROSS APPLY + MERGE/INSERT | 無記憶體控制碼、可並行、支援 XML 索引 |
| SQLXML 映射視圖 | 逐步轉為原生 XML 列 + 應用層映射 | 移除中介層、效能可控、開發模式現代化 |
| HTTP ISAPI 端點 | 改為 WCF/Web API + Entity Framework | 標準化、跨平台、支援現代驗證/限流 |
下篇將實戰演示:百萬級 XML 列的索引建立與查詢計劃分析、XQuery FLWOR 表達式優化技巧、XML DML 批次修改效能測試、以及混合關係/XML 查詢的成本基礎優化案例。