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 就是来去掉逗号,并赋予有意义的列明!