在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>
在连接查询时,
查询语句:
SELECT Categories.CategoryID, ProductID, ProductName FROM Categories JOIN Products ON Categories.CategoryID = Products.CategoryIDand ProductID <;4 WHERE 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,
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"/