標籤:style blog http color os ar for 資料 2014
原文:For XML PATH
SQL Server2005提供了一個新查詢文法——For XML PATH(‘‘),這個文法有什麼用呢?想象一下這樣一個查詢需求:有兩個表,班級表A、學生表B,要查詢一個班級裡有哪些學生?針對這個需求,方法有很多。舉例一下兩種:1、Join串連;2、For XML PATH(‘‘).
為了大家方便體驗效果,附上建立資料庫的代碼:
--班級表create table T_Class(CNo int primary key not null identity,--班級編號CName nvarchar(50) not null --班級名稱 )go--學生表create table T_Student(SNo int primary key not null identity,--學生編號Name nvarchar(50) not null , --學生姓名CNo int not null --所屬班級)go
1.首先最容易想到的就是用Join串連
Join串連代碼:
SELECTCName ,Name FROM T_Class c JOIN T_Student s ONs.CNo = c.CNo
Join:
圖1
已經基本滿足了之前要的查詢需求,但是感覺不夠直觀,這時候在想,能不能有這樣的效果,就是每個班級為一行,一行中的一列列出所有學生。接下來是今天要講得內容。
2.For XML PATH(‘‘)
先上代碼:
SELECT CNo,
CName,
(SELECT Name+‘,‘ FROM dbo.T_Student s WHERE s.CNo=c.CNo For XML Path(‘‘)) AS Student --單獨一列 ,所有學生在同一列中
FROM T_Class c
先上,之後再詳細講:
圖2
怎麼樣,是不是感覺更直觀了呢?
解釋說明:
Path(‘‘)中的參數如果為‘空‘(這裡的空是指str.length=0),且所要的列(這裡指Name)中如果沒有額外添加字元(這裡指Name後面的+’,‘ 請對照著上面的sql看),則產生Xml格式的字串,如3:
圖3
也就是說,如果沒有給path參數賦除了Null 字元串以外的值,產生的xml會是以相應列名為節點的Xml節點(這裡列名是Name,不是Student)。如果給一個非空的字串,則會以此字串為節點名稱來產生Xml,如4:
圖4
大家看到了,我在Name後面還加了個Null 字元串,如果不加這個Null 字元串會是什麼效果呢?請看圖5:
圖5
所以,如果沒有在所要的列中加入額外字元,所得的結果永遠都會有<列名>值</列名>這樣的Xml節點。也就是說如果要自己要的標籤名,需要做兩件事,1.在列名後面加任一字元;2.設定Path中的參數值為你想要的標籤名。
總結:當要查詢一個結果集,結果集裡面首先是一個主表,結果集裡面有一列是主表需要關聯到外表的時候(也就是1對多的情況下),可以用這個文法。這句話不大會表達,大家慢慢琢磨,說的不好的,大家給意見,互相學習,多謝。
For XML PATH