由於XML本身的諸多優點,XML技術已被廣泛的使用,目前的好多軟件技術同XML緊密相關,比如微軟的。net 平台對xml提供了強大的支持,提供System.Xml以及其子命名空間下的類型來操作XML.Ado.Net通過核心類型DataSet出色的把關系型數據庫同xml進行了緊密集成。由於平常許多開發人員使用。net 來操作SQL Server的到數據集後再轉換成xml,所以往往忽略Transact-SQL查詢生成XML數據的強大功能。對於一些項目使用XML查詢直接通過SQL生成XML會來的更為簡便,所以我通過在實際項目中的使用和查閱一些資料,以SQL 2000為例,寫成一個知識點,一是溫故而知新,二是對於一些開發者剛好需要這方面的技術而還沒有找到比較快捷的學習方式提供一條途徑。
在SQL Server 2000中查詢生成XML的語法表達式比較簡潔,整個語法如下:
SELECT <;select_list> FROM <;table_source> WHERE <;search_condition> FOR XML AUTO | RAW | EXPLICIT [,XMLDATA ] [,ELEMENTS] [,BINARY BASE64]
下面我將以Northwind數據庫來演示上面的表達式中所包含的各項功能,下面的查詢語句和返回結果都通過SQL Server 2000查詢分析器來執行和得到。
一、 使用AUTO模式
該模式我認為在生成單表XML數據方面是用得最多的,能滿足一般的需要。先來看他的簡單查詢。
1.簡單查詢
查詢語句:
SELECT CategoryID, CategoryName FROM CategorIEs WHERE CategoryID <; 3 FOR XML AUTO
返回結果:
<;Categories CategoryID="1" CategoryName="Beverages"/> <;CategorIEs CategoryID="2" CategoryName="Condiments"/>
也可以使用別名,
查詢語句:
SELECT CategoryID AS ID, CategoryName, GetDate() as CurrDate FROM CategorIEs MyTable WHERE CategoryID <; 3 FOR XML AUTO
返回結果:
<;MyTable ID="1" CategoryName="Beverages" CurrDate="2005-06-24T11:09:52.937"/> <;MyTable ID="2" CategoryName="Condiments" CurrDate="2005-06-24T11:09:52.937"/>
2.連接查詢
以兩個表為例,
查詢語句:
SELECT Categories.CategoryID, Categories.CategoryName, ProductID, ProductName FROM Categories JOIN Products ON Categories.CategoryID = Products.CategoryID AND ProductID <;5 WHERE CategorIEs.CategoryID <; 3 FOR XML AUTO
返回結果:
<;Categories CategoryID="1" CategoryName="Beverages"> <;Products ProductID="1" ProductName="Chai"/> <;/Categories> <;Categories CategoryID="2" CategoryName="Condiments"> <;Products ProductID="2" ProductName="Chang"/> <;/CategorIEs>
可以看到表連接查詢可以生成分層次的XML,不過需要注意的是SELECT子句中的父表的列要排在子表的列的前面,否則會出現你不想看到的結果,如:
查詢語句:
SELECT ProductID,Categories.CategoryID,Categories.CategoryName,ProductName FROM Categories JOIN Products ON Categories.CategoryID = Products.CategoryIDand ProductID <;5 WHERE CategorIEs.CategoryID <;3FOR XML AUTO
返回結果:
<;Products ProductID="1" ProductName="Chai"> <;Categories CategoryID="1" CategoryName="Beverages"/> <;/Products> <;Products ProductID="2" ProductName="Chang"> <;Categories CategoryID="1" CategoryName="Beverages"/> <;/Products> <;Products ProductID="3" ProductName="Aniseed Syrup"> <;Categories CategoryID="2" CategoryName="Condiments"/> <;/Products> <;Products ProductID="4" ProductName="Chef Anton's Cajun Seasoning"> <;CategorIEs CategoryID="2" CategoryName="Condiments"/> <;/Products>
2.使用ELEMENTS選項
使用該選項可以生成以元素為中心的Xml表示,默認為屬性方式,不過屬性方式節省空間。需要注意的是使用ELEMENTS選項是一種全是或全否的形式,不能得到一部分是以元素表示而另一部分以屬性表示的XML數據。
查詢語句:
SELECT CategoryID, CategoryName FROM CategorIEs WHERE CategoryID <; 3 FOR XML AUTO, ELEMENTS
返回結果:
<;Categories> <;CategoryID>1<;/CategoryID> <;CategoryName>Beverages<;/CategoryName> <;/Categories> <;Categories> <;CategoryID>2<;/CategoryID> <;CategoryName>Condiments<;/CategoryName> <;/CategorIEs>
在連接查詢時,
查詢語句:
返回結果:
<;Categories> <;CategoryID>1<;/CategoryID> <;Products> <;ProductID>1<;/ProductID> <;ProductName>Chai<;/ProductName> <;/Products> <;Products> <;ProductID>2<;/ProductID> <;ProductName>Chang<;/ProductName> <;/Products> <;/Categories> <;Categories> <;CategoryID>2<;/CategoryID> <;Products> <;ProductID>3<;/ProductID> <;ProductName>Aniseed Syrup<;/ProductName> <;/Products> <;/CategorIEs>
這是對二進制數據的操作,
查詢語句:
SELECT CategoryID, Picture FROM CategorIEs WHERE CategoryID = 1 FOR XML AUTO
返回結果:
<;Categories CategoryID="1" Picture="dbobject/CategorIEs[@CategoryID='1']/@Picture"/>
使用ELEMENTS方式,
查詢語句:
SELECT CategoryID, Picture FROM CategorIEs WHERE CategoryID = 1 FOR XML AUTO,ELEMENTS
返回結果:
<;Categories> <;CategoryID>1<;/CategoryID> <;Picture>dbobject/Categories[@CategoryID='1']/@Picture<;/Picture> <;/CategorIEs>
二、使用RAW模式
使用RAW模式不能使用ELEMENTS選項。
1.簡單查詢
查詢語句:
SELECT CategoryID, CategoryName AS Nanme FROM CategorIEs WHERE CategoryID <; 3 ORDER BY CategoryID DESC FOR XML RAW
返回結果:
<;row CategoryID="2" Nanme="Condiments"/> <;row CategoryID="1" Nanme="Beverages"/>
2.連接查詢
查詢語句:
SELECT Categories.CategoryID, Categories.CategoryName, ProductID, ProductName FROM Categories JOIN Products ON Categories.CategoryID = Products.CategoryIDand ProductID <;4 WHERE CategorIEs.CategoryID <;= 2FOR XML RAW
返回結果:
<;row CategoryID="1" CategoryName="Beverages" ProductID="1" ProductName="Chai"/> <;row CategoryID="1" CategoryName="Beverages" ProductID="2" ProductName="Chang"/> <;row CategoryID="2" CategoryName="Condiments" ProductID="3" ProductName="Aniseed Syrup"/>