XML可謂最新的數據存儲解決方案了。XML相比Html給予了web開發人員更大的編程靈活性。這種新技術驅動開發機構嘗試把XML同自己的產品集成起來。微軟就是采取如此舉措的先驅者。微軟公司在開發Internet產品的時候一度慢慢騰騰,現在可就不同了。最近一位微軟公司的高級職員就這樣說:“你要給我們一刀,傷口裡出來的盡是XML。”也許形容得有點過分,但事實確實是這樣的:微軟的幾乎所有產品中都能看到XML的身影。舉個例子:微軟是如何在其SQL Server產品線中集成XML的呢?下面咱們就來看看關鍵的FOR XML子句。
以XML的名義獲取信息
SQL Server和XML之間的集成首要一點就是根據SQL數據創建XML文件。XML文件的構造並不復雜,用簡單的腳本和ADO記錄集就可以輕松產生。這個任務雖然不算麻煩,但開發人員卻需要針對他們從服務器獲取的結果集合產生不同的腳本,或者編寫更為復雜的通用腳本。SELECT 語句則由此而配備了新的FOR XML子句。
該子句的語法如下所示:
[ FOR { XML { RAW | AUTO | EXPLICIT }
[ , XMLDATA ]
[ , ELEMENTS ]
[ , BINARY BASE64 ] } ]
FOR XML子句的XML模式由三種參數值表示:RAW、AUTO或者EXPLICIT。模式決定了結果XML的形式和組成。下面我們就更深入些地通過以下示例了解以上各個XML選項。
RAW示例
我們執行以下的SQL語句:
SET ROWCOUNT 3
SELECT Orders.OrderID, Orders.OrderDate, ProductID
FROM Orders, [Order Details]
WHERE Orders.OrderID = [Order Details].OrderID
ORDER BY Orders.OrderID
FOR XML RAW
執行後產生的結果如下:
<row OrderID="10248" OrderDate="1996-07-04T00:00:00" ProductID="11"/>
<row OrderID="10248" OrderDate="1996-07-04T00:00:00" ProductID="42"/>
<row OrderID="10248" OrderDate="1996-07-04T00:00:00" ProductID="72"/>
AUTO示例
我們執行以下的SQL語句
‘結果限制為3條記錄。
SET ROWCOUNT 3
SELECT Orders.OrderID, Orders.OrderDate, ProductID
FROM Orders, [Order Details]
WHERE Orders.OrderID = [Order Details].OrderID
ORDER BY Orders.OrderID
FOR XML AUTO
產生的結果如下所示:
<Orders OrderID="10248" OrderDate="1996-07-04T00:00:00">
<Order_x0020_Details ProductID="11"/>
<Order_x0020_Details ProductID="42"/>
<Order_x0020_Details ProductID="72"/>
</Orders>
EXPLICIT示例
Explicit模式給予查詢編程人員對產生XML的完全控制能力。然而這種控制力度卻要價不菲:你得編寫每一查詢以便SQL語句能包含XML信息。
有關的語法很復雜,而且超出了本文的討論范圍。[ , XMLDATA ] [ , ELEMENTS ] [ , BINARY BASE64 ] 是相應的可選參數。
可選元素
示例可以讓我們對各種設置的內部工作機理有更多的了解,下面我們就進一步研究下FOR XML語句的可選元素XMLDATA。
如果你設置該選項,那麼XML-Data schema就會包含在結果集合裡。以下是SQL語句:
SET ROWCOUNT 3
SELECT Orders.OrderID, Orders.OrderDate, ProductID
FROM Orders, [Order Details]
WHERE Orders.OrderID = [Order Details].OrderID
ORDER BY Orders.OrderID
FOR XML AUTO, XMLDATA
以上的SQL語句產生以下結果:
<Schema name="Schema2" xmlns="urn:schemas-microsoft-com:xml-data" XMLns:dt="urn:schemas-microsoft-com:datatypes">
<ElementType name="Orders" content="eltOnly" model="closed" order="many"><element type="Order_x0020_Details" maxOccurs="*"/>…
ELEMENTS
ELEMENTS選項指示各數據列作為子元素而非屬性返回。假如你采用AUTO模式就可以只采用該選項。
BINARY BASE64
使用該選項表示你希望采用base64編碼格式表示二進制數據。
采用XML子句的說法可就多了,你最好參考下SQL在線圖書。
在線指南
SQL Server在線圖書 對FOR XML子句的用法進行了闡述。而且還提到了在使用這一子句時要注意的多項限制。比方說,FOR XML字句不能同視圖定義或者COMPUTE BY子句合用。你不妨參考有關文檔了解更多細節。
本文只是對FOR XML子句的簡單說明,這裡要提醒你的是這一部分不過是XML同SQL Server集成需要注意的一點,其他方面的問題還包括IIS的OPENXML 函數和模版文件等。看來真是這樣,SQL Server的每個毛孔都滴著XML這種東西。