FOR XML PATH 有的人可能知道有的人可能不知道,其實它就是將查詢結果集以XML形式展示,有了它咱們能夠簡化咱們的查詢語句實現一些之前可能須要藉助函數活存儲過程來完成的工做。那麼以一個實例爲主.編程
一.FOR XML PATH 簡單介紹函數
那麼仍是首先來介紹一下FOR XML PATH ,假設如今有一張興趣愛好表(hobby)用來存放興趣愛好,表結構以下:this
接下來咱們來看應用FOR XML PATH的查詢結果語句以下:spa
SELECT * FROM @hobby FOR XML PATH
結果:code
<row> <hobbyID>1</hobbyID> <hName>登山</hName> </row> <row> <hobbyID>2</hobbyID> <hName>游泳</hName> </row> <row> <hobbyID>3</hobbyID> <hName>美食</hName> </row>
因而可知FOR XML PATH 能夠將查詢結果根據行輸出成XML各式!blog
那麼,如何改變XML行節點的名稱呢?代碼以下: 文檔
SELECT * FROM @hobby FOR XML PATH('MyHobby')
結果必定也可想而知了吧?沒錯原來的行節點<row> 變成了咱們在PATH後面括號()中,自定義的名稱<MyHobby>,結果以下:字符串
<MyHobby> <hobbyID>1</hobbyID> <hName>登山</hName> </MyHobby> <MyHobby> <hobbyID>2</hobbyID> <hName>游泳</hName> </MyHobby> <MyHobby> <hobbyID>3</hobbyID> <hName>美食</hName> </MyHobby>
這個時候細心的朋友必定又會問那麼列節點如何改變呢?還記的給列起別名的關鍵字AS嗎?對了就是用它!代碼以下:it
SELECT hobbyID as 'MyCode',hName as 'MyName' FROM @hobby FOR XML PATH('MyHobby')
那麼這個時候咱們列的節點名稱也會編程咱們自定義的名稱 <MyCode>與<MyName>結果以下: class
<MyHobby> <MyCode>1</MyCode> <MyName>登山</MyName> </MyHobby> <MyHobby> <MyCode>2</MyCode> <MyName>游泳</MyName> </MyHobby> <MyHobby> <MyCode>3</MyCode> <MyName>美食</MyName> </MyHobby>
噢! 既然行的節點與列的節點咱們均可以自定義,咱們是否能夠構建咱們喜歡的輸出方式呢?仍是看代碼:
SELECT '[ '+hName+' ]' FROM @hobby FOR XML PATH('')
沒錯咱們還能夠經過符號+號,來對字符串類型字段的輸出格式進行定義。結果以下:
那麼其餘類型的列怎麼自定義? 不要緊,咱們將它們轉換成字符串類型就行啦!例如:
SELECT '{'+STR(hobbyID)+'}','[ '+hName+' ]' FROM @hobby FOR XML PATH('')
好的 FOR XML PATH就基本介紹到這裏吧,更多關於FOR XML的知識請查閱幫助文檔!
接下來咱們來看一個FOR XML PATH的應用場景吧!那麼開始吧。。。。。。
二.一個應用場景與FOR XML PATH應用
首先呢!咱們在增長一張學生表,列分別爲(stuID,sName,hobby),stuID表明學生編號,sName表明學生姓名,hobby列存學生的愛好!那麼如今表結構以下:
這時,咱們的要求是查詢學生表,顯示全部學生的愛好的結果集,代碼以下:
SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby FROM ( SELECT sName, (SELECT hobby+',' FROM student WHERE sName=A.sName FOR XML PATH('')) AS StuList FROM student A GROUP BY sName ) B
結果以下:
分析: 好的,那麼咱們來分析一下,首先看這句:
SELECT hobby+',' FROM student WHERE sName=A.sName FOR XML PATH('')
這句是經過FOR XML PATH 將某一姓名如張三的愛好,顯示成格式爲:「 愛好1,愛好2,愛好3,」的格式!
那麼接着看:
SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby FROM ( SELECT sName, (SELECT hobby+',' FROM student WHERE sName=A.sName FOR XML PATH('')) AS StuList FROM student A GROUP BY sName ) B
剩下的代碼首先是將表分組,在執行FOR XML PATH 格式化,這時當尚未執行最外層的SELECT時查詢出的結構爲:
能夠看到StuList列裏面的數據都會多出一個逗號,這時隨外層的語句:SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby 就是來去掉逗號,並賦予有意義的列明!