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