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參數賦除了空字符串以外的值,生成的xml會是以相應列名為節點的Xml節點(這里列名是Name,不是Student)。如果給一個非空的字符串,則會以此字符串為節點名稱來生成Xml,如下圖4:

                            圖4

大家看到了,我在Name后面還加了個空字符串,如果不加這個空字符串會是什么效果呢?請看圖5:  

  

              圖5

所以,如果沒有在所要的列中加入額外字符,所得的結果永遠都會有<列名>值</列名>這樣的Xml節點。也就是說如果要自己要的標簽名,需要做兩件事,1.在列名后面加任意字符;2.設置Path中的參數值為你想要的標簽名。

總結:當要查詢一個結果集,結果集里面首先是一個主表,結果集里面有一列是主表需要關聯到外表的時候(也就是1對多的情況下),可以用這個語法。這句話不大會表達,大家慢慢琢磨,說的不好的,大家給意見,互相學習,多謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM