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