本文是根據 Microsoft sql server(代號為“Yukon”)Beta 1 撰寫的,其中包含的所有信息均可能發生更改。iTbulo .comJuM0yGX
下載本文的代碼:XMLinYukon.exe (114KB)iTbulo .comJuM0yGX
XML 數據類型 XML 索引 XML 數據類型函數 XQuery 1.0 — 一種 XML 查詢語言 使用 XQuery 函數 SQL Server 中的 XQuery 擴展函數 XML DML — 更新 XML 列 FOR XML 和 OpenXML 的增強功能 原生 Web 服務支持 總結 iTbulo .comJuM0yGX
Microsoft SQL Server™ 的下一個版本(代號“Yukon”)吸收了在 SQL Server 2000 中引入的開創性 XML 支持,並為它加入更多創新性功能並且賦予它更好的易用性。Yukon 通過一種新的原生 XML 數據類型為數據庫管理系統 (DBMS) 添加了原生 XML 數據存儲。這種原生 XML 數據類型的引入,再結合新興的行業標准 XQuery 語言,將在數據庫應用程序開發中引發一場革命。iTbulo .comJuM0yGX
對原生 XML 數據類型的支持是廣泛的。它包括基於 XML 架構的驗證和基於 XML 的附加約束、基於 XML Infoset 的特殊索引以及使用 XQuery 對 XML 內容對象的查詢。除了這個主要的新功能之外,為了獲得更好的性能和易用性,還對現有的 SQL Server 2000 XML 功能進行了細微的調整。iTbulo .comJuM0yGX
XML 本身是一種與平台無關的數據表示格式,最初作為文檔格式使用。由於 XML 已經獲得廣泛認可,用戶已經設法解決了 XML 解決棘手的業務問題,如數據集成。這就使得作為數據存儲格式的 XML 不斷發展。XML,像其結構化的對應物一樣,有基於 XML 架構定義語言 (XSD) 的自有類型系統。XML 和 XSD 均為推薦級的 W3C 標准。XML 架構定義 XML 文檔的格式,正如 SQL Server 架構定義 SQL Server 數據庫中對象的布局一樣。XML 類型系統相當嚴密;XSD 幾乎可以定義關系型數據庫、面向對象的類型系統、半結構化和非結構化的文檔格式中的所有構造。(請參見提要欄“標准依從性”。)iTbulo .comJuM0yGX
圖 1 用 FOR XML 返回的具有層次結構的 XMLiTbulo .comJuM0yGX
XML 數據具有層次結構,並且在業務應用程序中使用的 XML 文檔通常由存儲在多個關系表中的數據組成。例如,一個 XML 定單文檔可能包含客戶信息、定單信息以及定單細節信息。在關系型數據庫中,通常將這樣的信息存儲在多個表中。在 SQL Server 2000 中,如果要存儲 XML,有兩種選擇:將整個文檔存儲在一個文本字段中,或者將文檔分解為多個關系表。如果選擇文本字段存儲,則用 SQL Server 僅能存儲和檢索數據;而對文檔內容的查詢則發生在客戶端庫中。iTbulo .comJuM0yGX
圖 2 用 OpenXML 生成表iTbulo .comJuM0yGX
在 SQL Server 2000 中,使用 Transact-SQL (T-SQL) SELECT 語句的 FOR XML 擴展,可以查詢多個關系表,並可將返回的數據組合成具有層次結構的 XML 文檔,如圖 1 所示。系統定義的 OPENXML 函數完成文檔的分解,如圖 2 所示,同時還允許在 XML 和關系數據之間進行分布式關系查詢。在 Yukon 中,增強了這種支持,引入了合成、分解以及分布式關系查詢。此外,還引入了原生 XML 查詢和原生 XML 存儲,如圖 3 所示。iTbulo .comJuM0yGX
圖 3 XML 存儲iTbulo .comJuM0yGX
讓我們來看看 XML 數據類型,並分析它與 XML 文檔的傳統存儲方式 — 文本數據類型 — 的區別。包括用作表中的一列、T-SQL 中的一個變量、存儲過程或用戶定義的函數的參數,或者用作用戶定義的函數的返回值。iTbulo .comJuM0yGX
ML 類型與 SQL-100(ANSI SQL 標准的最新版本)定義的相異 (DISTINCT) 類型的概念十分相似,還與基於字符的大對象 (CLOB) 類型 varchar(max) 和 nvarchar(max) 十分相似。盡管 T-SQL INSERT 語句會自動將 VALUES 列表中使用的 varchar 值或 nvarchar 值轉換為 XML 數據類型的列值,但必須在該數據類型與 varchar 類型或 nvarchar 類型間進行轉換。您無法用 CAST 或 CONVERT 將 XML 類型轉換為除 varchar 或 nvarchar 外的任何其他類型。XML 數據類型的兩個實例無法進行比較。與 SQL-99 的相異類型類似,XML 類型有自己的方法;這些方法使您能夠使用替代的查詢語言 XQuery。XML 類型中的數據不遵循關系數據模型,但遵循 XQuery 1.0 和 XPath 2.0 數據模型。iTbulo .comJuM0yGX
使用 XML 數據類型的主要原因是,當定義一個 XML 數據類型列時,則將該列中的數據本身存儲在數據庫中。在該文件系統上,列不是一個指向 XML 文檔的指針。這意味著,XML 數據被包含在備份和還原過程中,受常規的 SQL Server 安全性保護,並參與事務和日志記錄。盡管在關系型數據庫內部存放 XML 數據可能會讓一些關系模型的純粹化論者不高興,但這意味著基於管理、可靠性以及控制等原因而將數據存儲在了單個庫中。iTbulo .comJuM0yGX
下面是一個在表中使用 XML 類型的示例。該表以 XML 格式存儲發票文檔。iTbulo .comJuM0yGX
CREATE TABLE invoices ( id INTEGER IDENTITY PRIMARY KEY, xmlinvoice XML)
請注意,無法將 XML 列本身用作主鍵。這是因為無法直接比較 XML 數據類型的實例,盡管它們能包含 NULL 值(且能夠測試是否為 NULL 值)。雖然不難對 XML 數據執行字符串比較,但是在數據級執行比較的難度將會增加一個數量級。例如,下面的兩個 XML 文檔在數據上等效,但在詞法上卻毫無等效性可言:iTbulo .comJuM0yGX
<!-- These two documents are equivalent --> <doc1> <row au_id="111-11-1111"/> </doc1> <doc1> <row au_id='111-11-1111'>