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參數賦除了空字符串以外的值,生成的xml會是以相應列名為節點的Xml節點(這里列名是Name,不是Student)。如果給一個非空的字符串,則會以此字符串為節點名稱來生成Xml,如下圖4:
圖4
大家看到了,我在Name后面還加了個空字符串,如果不加這個空字符串會是什么效果呢?請看圖5:
圖5
所以,如果沒有在所要的列中加入額外字符,所得的結果永遠都會有<列名>值</列名>這樣的Xml節點。也就是說如果要自己要的標簽名,需要做兩件事,1.在列名后面加任意字符;2.設置Path中的參數值為你想要的標簽名。
總結:當要查詢一個結果集,結果集里面首先是一個主表,結果集里面有一列是主表需要關聯到外表的時候(也就是1對多的情況下),可以用這個語法。這句話不大會表達,大家慢慢琢磨,說的不好的,大家給意見,互相學習,多謝。