不少人對Xpath可能比較熟悉,但不知道有沒有直接操做過數據庫,咱們都知道 在Sql2005裏公支持的幾種查詢有Raw,Auto模式,頁並無Path和Elements用法等,若是在2000裏使用過 Raw模式的朋友應該知道,是不容易處理查詢結果的,那麼在2005裏對這一塊作了很好的提高html
我先來介紹一下什麼是Sql For Xml吧,咱們大多時候都會有這種狀況,想把表裏的數據轉化成Xml格式的,一般咱們會使用c#或是Vb程序來轉 公,使用Xpath或是XmlDocument等對象來完成,固然這樣是能夠的,不過這樣處理起來就會出現不少問題,好比說數據庫變化,若是隻有數據變化 那方便,寫一個通用的類,每次查詢前更新Xml文件就能夠了,但若是出現數據庫結構的變化就會很吃力了,那麼有沒有一種方法,把數據在調出數據庫以前就轉 化爲Xml的呢,這個是固然的,就是咱們的For Xml,你們在查詢分析器裏作表結果查詢的時候通常是這樣寫的數據庫
咱們給你們展現一下我所用到的兩個表吧c#
第一個表班級信息表ClassInfo(班級信息表一共三個字段CID 本表ID,Cnumber 班級人數,CName 班級名稱)ide
第二個表 生信息表 Students (CID 班級表外鍵,SID學生信息表ID學生的學號就是,SName)測試
SELECT
CID,Cnumber,CName
FROM
ClassInfo
WHERE
CName
=
'
博客園一班
'
結果爲:字體
一般是這種方法,或是再加上個Order BY 什麼的,或是像inner join 等查詢的東東,其實咱們只要在這條語句上少許的改動一下就能夠獲得咱們想要的Xml數據了,也許 有朋友已經想到了是 For Xml 對就是這樣的spa
SELECT
CID,Cnumber,CName
FROM
ClassInfo
WHERE
CName
=
'
博客園一班
'
FOR
xml
raw
這樣查詢獲得的結果以下:3d
咱們若是想看的更清楚的話只要單擊一個就能夠獲得相應的Xml文件的形式了調試
這裏應該就是咱們想要的Xml文件的形式了,其實就是這麼簡單的,咱們能夠經過Ado的方式 把他查詢獲得UI直接使用就OK了,code
咱們能夠看到咱們獲得的信息並不完整,沒有學生信息,咱們要吧使用一個鏈接的形式來完成看下面的Sql語句
SELECT
ClassInfo.CID,ClassInfo.Cnumber,ClassInfo.CName,Students.SID,Students.SName
FROM
ClassInfo
JOIN
dbo.Students
ON
Students.CID
=
dbo.ClassInfo.CID
ORDER
BY
CID
FOR
xml
raw
這裏咱們是查詢全部的學生和所在班級的信息
結果爲:
raw 的形式是以屬性的方法來顯示字段的,咱們還可使用Auto,Auto是自動 ,它的意思 不用我多說看例子,(字體檢查相關項目)
咱們把上面的代碼修改一下
SELECT
ClassInfo.CID,ClassInfo.Cnumber,ClassInfo.CName,Students.SID,Students.SName
FROM
ClassInfo
JOIN
dbo.Students
ON
Students.CID
=
dbo.ClassInfo.CID
ORDER
BY
CID
FOR
xml auto
這樣就能獲得更爲合理的數據,返回的結果以下
<
ClassInfo
CID
="1"
Cnumber
="100"
CName
="博客園一班"
>
<
dbo.Students
SID
="1"
SName
="蘇飛"
/>
<
dbo.Students
SID
="2"
SName
="金色海洋"
/>
</
ClassInfo
>
<
ClassInfo
CID
="2"
Cnumber
="10"
CName
="博客園二班"
>
<
dbo.Students
SID
="3"
SName
="趙劼"
/>
<
dbo.Students
SID
="4"
SName
="DUDU"
/>
</
ClassInfo
>
<
ClassInfo
CID
="3"
Cnumber
="5"
CName
="博客園二班"
>
<
dbo.Students
SID
="5"
SName
="李永京"
/>
</
ClassInfo
>
咱們能夠看到這裏沒有根結點,固然咱們要吧經過Root屬性來完成
修改Sql語句
SELECT
ClassInfo.CID,ClassInfo.Cnumber,ClassInfo.CName,Students.SID,Students.SName
FROM
ClassInfo
JOIN
dbo.Students
ON
Students.CID
=
dbo.ClassInfo.CID
ORDER
BY
CID
FOR
xml auto ,root(
'
studentInfo
'
)
返回結果
<
studentInfo
>
<
ClassInfo
CID
="1"
Cnumber
="100"
CName
="博客園一班"
>
<
dbo.Students
SID
="1"
SName
="蘇飛"
/>
<
dbo.Students
SID
="2"
SName
="金色海洋"
/>
</
ClassInfo
>
<
ClassInfo
CID
="2"
Cnumber
="10"
CName
="博客園二班"
>
<
dbo.Students
SID
="3"
SName
="趙劼"
/>
<
dbo.Students
SID
="4"
SName
="DUDU"
/>
</
ClassInfo
>
<
ClassInfo
CID
="3"
Cnumber
="5"
CName
="博客園二班"
>
<
dbo.Students
SID
="5"
SName
="李永京"
/>
</
ClassInfo
>
</
studentInfo
>
咱們發現和咱們平時常的Xml文檔的格式仍是不同,咱們再加上一個Elements屬性試試
SELECT
ClassInfo.CID,ClassInfo.Cnumber,ClassInfo.CName,Students.SID,Students.SName
FROM
ClassInfo
JOIN
dbo.Students
ON
Students.CID
=
dbo.ClassInfo.CID
ORDER
BY
CID
FOR
xml auto ,root(
'
studentInfo
'
),Elements
返回的結果以下
<
studentInfo
>
<
ClassInfo
>
<
CID
>
1
</
CID
>
<
Cnumber
>
100
</
Cnumber
>
<
CName
>
博客園一班
</
CName
>
<
dbo.Students
>
<
SID
>
1
</
SID
>
<
SName
>
蘇飛
</
SName
>
</
dbo.Students
>
<
dbo.Students
>
<
SID
>
2
</
SID
>
<
SName
>
金色海洋
</
SName
>
</
dbo.Students
>
</
ClassInfo
>
<
ClassInfo
>
<
CID
>
2
</
CID
>
<
Cnumber
>
10
</
Cnumber
>
<
CName
>
博客園二班
</
CName
>
<
dbo.Students
>
<
SID
>
3
</
SID
>
<
SName
>
趙劼
</
SName
>
</
dbo.Students
>
<
dbo.Students
>
<
SID
>
4
</
SID
>
<
SName
>
DUDU
</
SName
>
</
dbo.Students
>
</
ClassInfo
>
<
ClassInfo
>
<
CID
>
3
</
CID
>
<
Cnumber
>
5
</
Cnumber
>
<
CName
>
博客園二班
</
CName
>
<
dbo.Students
>
<
SID
>
5
</
SID
>
<
SName
>
李永京
</
SName
>
</
dbo.Students
>
</
ClassInfo
>
</
studentInfo
>
基本是咱們想要的數據了吧,咱們還可使用這樣兩個語句來完成,咱們前面提到過Path 和Raw,其它在這裏只要換成其中的一個就行結果是同樣的
咱們可看一下修改後的代碼
SELECT
ClassInfo.CID,ClassInfo.Cnumber,ClassInfo.CName,Students.SID,Students.SName
FROM
ClassInfo
JOIN
dbo.Students
ON
Students.CID
=
dbo.ClassInfo.CID
ORDER
BY
CID
FOR
xml
raw
,root(
'
studentInfo
'
),Elements
看結果吧
<
studentInfo
>
<
row
>
<
CID
>
1
</
CID
>
<
Cnumber
>
100
</
Cnumber
>
<
CName
>
博客園一班
</
CName
>
<
SID
>
1
</
SID
>
<
SName
>
蘇飛
</
SName
>
</
row
>
<
row
>
<
CID
>
1
</
CID
>
<
Cnumber
>
100
</
Cnumber
>
<
CName
>
博客園一班
</
CName
>
<
SID
>
2
</
SID
>
<
SName
>
金色海洋
</
SName
>
</
row
>
<
row
>
<
CID
>
2
</
CID
>
<
Cnumber
>
10
</
Cnumber
>
<
CName
>
博客園二班
</
CName
>
<
SID
>
3
</
SID
>
<
SName
>
趙劼
</
SName
>
</
row
>
<
row
>
<
CID
>
2
</
CID
>
<
Cnumber
>
10
</
Cnumber
>
<
CName
>
博客園二班
</
CName
>
<
SID
>
4
</
SID
>
<
SName
>
DUDU
</
SName
>
</
row
>
<
row
>
<
CID
>
3
</
CID
>
<
Cnumber
>
5
</
Cnumber
>
<
CName
>
博客園二班
</
CName
>
<
SID
>
5
</
SID
>
<
SName
>
李永京
</
SName
>
</
row
>
</
studentInfo
>
我相信這樣的數據咱們查詢和處理起來就方便多了,
若是你們想要這樣的數據其實要吧直接使用Path模式,這樣會更方法
看代碼
SELECT
ClassInfo.CID,ClassInfo.Cnumber,ClassInfo.CName,Students.SID,Students.SName
FROM
ClassInfo
JOIN
dbo.Students
ON
Students.CID
=
dbo.ClassInfo.CID
ORDER
BY
CID
FOR
xml path ,root(
'
studentInfo
'
)
結果和上面的是徹底同樣的,也就是說這裏不用再加上Elements屬性也是同樣的,也是咱們最經常使用的一種方式
結果就再也不貼了,相信簡單的知道 這些之後已經能幫助很多對這塊不怎麼理解的朋友解決一部分問題了,由於基本的查詢也就是這麼多,咱們在使用的時候只要返回結果集的第一行第一列就好了,而後怎麼處理就是c#代碼怎麼處理Xml文檔的問題了,
總結一下這幾個東東吧,
Path 是以數據基本結構也就是以字段爲結點的形式返回Xml文檔(這樣說不專業可能容易理解)
Raw 是把數據裏全部的字段以屬性的方式顯示出Xml文檔
Auto 自動關連到相應的項目,和Raw同樣在不加Elements屬性時以這種方式返回數據
建議你們作幾個測試共沒有幾行代碼,多動手才能真正體會它有作用
這些應該是入門級的,下節我但願能給你們介紹一下更深一點的東東,記得動手調試,,,,,,,,,,,,,,,,,,,,,,,,,,
本文來自於http://www.cnblogs.com/sufei/archive/2010/04/24/1719037.html