1 導言
Microsoft 在Microsoft SQL Server 2000中推出了與XML相關的功能以及Transact-SQL 關鍵字FOR XML和OPENXML ,這使得開發人員可以編寫Transact-SQL代碼來獲取XML流形式的查詢結果,並將一個XML文檔分割成一個rowset。SQL Server 2005顯著的擴展了這些XML功能,推出了一個支持XSD schema驗證、基於XQuery的操作和XML索引的本地的xml 數據類型。SQL Server 2008建立在之前版本的XML功能基礎之上,做了改進來迎接客戶在存儲和操縱數據庫中的XML數據時所面臨的挑戰。
2 SQL Server XML 功能的發展歷程
SQL Server的XML功能隨著從SQL Server2000版本以來的每一個版本而不斷發展。在我們檢查SQL Server 2008中的改進之前,通過之前的版本來總結XML功能的發展歷程可能會比較有用。
2.1 SQL Server 2000中的XML功能
在SQL Server 2000中,Microsoft 推出了Transact-SQL 關鍵字FOR XML和OPENXML。FOR XML 是對SELECT語句的擴展,它返回如下面的示例所示的XML流式的查詢結果。
SELECT ProductID, ProductName
FROM Products Product
FOR XML AUTO
這個查詢返回一個如下面示例所示的XML片斷:
<Product ProductID="1" ProductName="Widget"/>
<Product ProductID="2" ProductName="Sprocket"/>
OPENXML 功能執行與FOR XML 條件子句相反的功能,它創建一個XML文檔的rowset ,如下面的示例所示:
DECLARE @doc nvarchar(1000)
SET @doc = '<Order OrderID = "1011">
<Item ProductID="1" Quantity="2"/>
<Item ProductID="2" Quantity="1"/>
</Order>'
DECLARE @XMLDoc integer
EXEC sp_xml_preparedocument @XMLDoc OUTPUT, @doc
SELECT * FROM
OPENXML (@XMLDoc, 'Order/Item', 1)
WITH
(OrderID integer '../@OrderID',
ProductID integer,
Quantity integer)
EXEC sp_xml_removedocument @XMLDoc
注意用sp_xml_preparedocument和sp_xml_removedocument 存儲過程來創建XML文檔的節點樹的一個內存展示的用法。這個Transact-SQL 代碼返回下面的rowset。
OrderID ProductID Quantity
1011 1 2
1011 2 1