top
Loading...
簡單應用:使用MSSQL的XML進行查詢

由于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,CategoryNameFROM CategoriesWHERE CategoryID <; 3 FOR XML AUTO

返回結果:

<;Categories CategoryID="1" CategoryName="Beverages"/><;Categories CategoryID="2" CategoryName="Condiments"/>

也可以使用別名,

查詢語句:

SELECT CategoryID AS ID,CategoryName,GetDate() as CurrDateFROM Categories MyTableWHERE 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,ProductNameFROM CategoriesJOIN Products ON Categories.CategoryID = Products.CategoryID AND ProductID <;5WHERE 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,ProductNameFROM CategoriesJOIN Products ON Categories.CategoryID = Products.CategoryIDand ProductID <;5WHERE 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,CategoryNameFROM CategoriesWHERE CategoryID <; 3FOR XML AUTO, ELEMENTS

返回結果:

<;Categories><;CategoryID>1<;/CategoryID><;CategoryName>Beverages<;/CategoryName><;/Categories><;Categories><;CategoryID>2<;/CategoryID><;CategoryName>Condiments<;/CategoryName><;/Categories>

在連接查詢時,

查詢語句:

SELECT Categories.CategoryID,ProductID,ProductNameFROM CategoriesJOIN Products ON Categories.CategoryID = Products.CategoryIDand ProductID <;4WHERE Categories.CategoryID <;3FOR XML AUTO, ELEMENTS

返回結果:

<;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>
4.檢索對二進制數據的XPath引用

這是對二進制數據的操作,

查詢語句:

SELECT CategoryID,PictureFROM CategoriesWHERE CategoryID = 1FOR XML AUTO

返回結果:

<;Categories CategoryID="1" Picture="dbobject/Categories[@CategoryID='1']/@Picture"/>

使用ELEMENTS方式,

查詢語句:

SELECT CategoryID,PictureFROM CategoriesWHERE CategoryID = 1FOR XML AUTO,ELEMENTS

返回結果:

<;Categories><;CategoryID>1<;/CategoryID><;Picture>dbobject/Categories[@CategoryID='1']/@Picture<;/Picture><;/Categories>

二、使用RAW模式

使用RAW模式不能使用ELEMENTS選項。

1.簡單查詢

查詢語句:

SELECT CategoryID,CategoryName AS NanmeFROM CategoriesWHERE CategoryID <; 3ORDER BY CategoryID DESCFOR XML RAW

返回結果:

<;row CategoryID="2" Nanme="Condiments"/><;row CategoryID="1" Nanme="Beverages"/>

2.連接查詢

查詢語句:

SELECT Categories.CategoryID,Categories.CategoryName,ProductID,ProductNameFROM CategoriesJOIN Products ON Categories.CategoryID = Products.CategoryIDand ProductID <;4WHERE 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"/>
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗