日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

灵活运用 SQL SERVER FOR XML PATH

發(fā)布時(shí)間:2023/11/27 生活经验 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 灵活运用 SQL SERVER FOR XML PATH 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?FOR XML PATH 有的人可能知道有的人可能不知道,其實(shí)它就是將查詢結(jié)果集以XML形式展現(xiàn),有了它我們可以簡化我們的查詢語句實(shí)現(xiàn)一些以前可能需要借助函數(shù)活存儲(chǔ)過程來完成的工作。那么以一個(gè)實(shí)例為主.

????????一.FOR XML PATH 簡單介紹

?????????????那么還是首先來介紹一下FOR XML PATH ,假設(shè)現(xiàn)在有一張興趣愛好表(hobby)用來存放興趣愛好,表結(jié)構(gòu)如下:

???????接下來我們來看應(yīng)用FOR XML PATH的查詢結(jié)果語句如下:

SELECT?*?FROM?@hobby?FOR?XML?PATH

?????? 結(jié)果:

<row>
??<hobbyID>1</hobbyID>
??<hName>爬山</hName>
</row>
<row>
??<hobbyID>2</hobbyID>
??<hName>游泳</hName>
</row>
<row>
??<hobbyID>3</hobbyID>
??<hName>美食</hName>
</row>

????? 由此可見FOR XML PATH 可以將查詢結(jié)果根據(jù)行輸出成XML各式!

????? 那么,如何改變XML行節(jié)點(diǎn)的名稱呢?代碼如下:?????

SELECT?*?FROM?@hobby?FOR?XML?PATH('MyHobby')

?

????? 結(jié)果一定也可想而知了吧?沒錯(cuò)原來的行節(jié)點(diǎn)<row> 變成了我們?cè)赑ATH后面括號(hào)()中,自定義的名稱<MyHobby>,結(jié)果如下:

<MyHobby>
??<hobbyID>1</hobbyID>
??<hName>爬山</hName>
</MyHobby>
<MyHobby>
??<hobbyID>2</hobbyID>
??<hName>游泳</hName>
</MyHobby>
<MyHobby>
??<hobbyID>3</hobbyID>
??<hName>美食</hName>
</MyHobby>

????? 這個(gè)時(shí)候細(xì)心的朋友一定又會(huì)問那么列節(jié)點(diǎn)如何改變呢?還記的給列起別名的關(guān)鍵字AS嗎?對(duì)了就是用它!代碼如下:

SELECT?hobbyID?as?'MyCode',hName?as?'MyName'?FROM?@hobby?FOR?XML?PATH('MyHobby')

?

????? 那么這個(gè)時(shí)候我們列的節(jié)點(diǎn)名稱也會(huì)編程我們自定義的名稱 <MyCode>與<MyName>結(jié)果如下:

<MyHobby>
??<MyCode>1</MyCode>
??<MyName>爬山</MyName>
</MyHobby>
<MyHobby>
??<MyCode>2</MyCode>
??<MyName>游泳</MyName>
</MyHobby>
<MyHobby>
??<MyCode>3</MyCode>
??<MyName>美食</MyName>
</MyHobby>

??? 噢! 既然行的節(jié)點(diǎn)與列的節(jié)點(diǎn)我們都可以自定義,我們是否可以構(gòu)建我們喜歡的輸出方式呢?還是看代碼:?

SELECT?'[?'+hName+'?]'?FROM?@hobby?FOR?XML?PATH('')

??? 沒錯(cuò)我們還可以通過符號(hào)+號(hào),來對(duì)字符串類型字段的輸出格式進(jìn)行定義。結(jié)果如下:

[?爬山?][?游泳?][?美食?]

??? 那么其他類型的列怎么自定義? 沒關(guān)系,我們將它們轉(zhuǎn)換成字符串類型就行啦!例如:

SELECT?'{'+STR(hobbyID)+'}','[?'+hName+'?]'?FROM?@hobby?FOR?XML?PATH('')

??? 好的 FOR XML PATH就基本介紹到這里吧,更多關(guān)于FOR XML的知識(shí)請(qǐng)查閱幫助文檔!

??? 接下來我們來看一個(gè)FOR XML PATH的應(yīng)用場景吧!那么開始吧。。。。。。

??????? 二.一個(gè)應(yīng)用場景與FOR XML PATH應(yīng)用

????????首先呢!我們?cè)谠黾右粡垖W(xué)生表,列分別為(stuID,sName,hobby),stuID代表學(xué)生編號(hào),sName代表學(xué)生姓名,hobby列存學(xué)生的愛好!那么現(xiàn)在表結(jié)構(gòu)如下:

???????????

??????? 這時(shí),我們的要求是查詢學(xué)生表,顯示所有學(xué)生的愛好的結(jié)果集,代碼如下:

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?

???????? 結(jié)果如下:

?分析:?好的,那么我們來分析一下,首先看這句:

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??

剩下的代碼首先是將表分組,在執(zhí)行FOR XML PATH 格式化,這時(shí)當(dāng)還沒有執(zhí)行最外層的SELECT時(shí)查詢出的結(jié)構(gòu)為:

可以看到StuList列里面的數(shù)據(jù)都會(huì)多出一個(gè)逗號(hào),這時(shí)隨外層的語句:SELECT?B.sName,LEFT(StuList,LEN(StuList)-1)?as?hobby??就是來去掉逗號(hào),并賦予有意義的列明!

轉(zhuǎn)載于:https://www.cnblogs.com/shiyh/p/7146510.html

總結(jié)

以上是生活随笔為你收集整理的灵活运用 SQL SERVER FOR XML PATH的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。