FOR XML PATH
比如有一张兴趣表:
SELECT * FROM Hobby FOR XML PATH
可以看到结果:
<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各式!
但是如何改变XML行节点的名称呢?
SELECT * FROM @hobby FOR XML PATH('MyHobby')
可以看到:
<MyHobby>
<hobbyID>1</hobbyID>
<hName>爬山</hName>
</MyHobby>
<MyHobby>
<hobbyID>2</hobbyID>
<hName>游泳</hName>
</MyHobby>
<MyHobby>
<hobbyID>3</hobbyID>
<hName>美食</hName>
</MyHobby>
可以看到:
原来的行节点<row> 变成了我们在PATH后面括号()中,自定义的名称
那么又如何改变列节点的名称?使用给列起别名的 as
列起别名的关键字AS
SELECT hobbyID as 'MyCode',hName as 'MyName' FROM hobby FOR XML PATH('MyHobby')
行和列都可以定义,那么也可以定义成自己想要的方式:
SELECT '[ '+hName+' ]' FROM hobby FOR XML PATH('')
结果就成这样: [ 爬山 ][ 游泳 ][ 美食 ]
那么其他列的类型怎么定义?可以先转为字符串
SELECT '{'+STR(hobbyID)+'}','[ '+hName+' ]' FROM hobby FOR XML PATH('')
使用场景列子:比如学生表数据这样
要求显示所有学生的爱好的结果集
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,”的格式!
剩下的代码首先是将表分组,
可以看到StuList列里面的数据都会多出一个逗号,这时随外层的语句:SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby 就是来去掉逗号,并赋予有意义的列明!
来点题外的:这玩意还可以拼table
SET @HtmlContent =
+ N'<html>'
+ N'<style type="text/css">'
+ N' td {border:solid #9ec9ec; border-width:0px 1px 1px 0px; padding:4px 0px;}'
+ N' table {border:1px solid #9ec9ec; width:100%;border-width:1px 0px 0px 1px;text-align:center;font-size:12px}'
+ N'</style>'
+ N'<H1 style="color:#FF0000; text-align:center;font-size:14px">' + @EmailHead +'</H1>'
+ N'<table >'
+ N'<tr><th>磁盘盘符</th><th>总大小(GB)</th><th>已用空间(GB)</th><th>剩余空间(GB)</th>'
+ N'<th>已用比例(%)</th><th>剩余比例(%)</th></tr >' +
CAST ( ( SELECT
td = DiskCD , '',
td = STR(TotalSize*1.0/1024,6,2) , '',
td = STR((TotalSize - FreeSize)*1.0/1024,6,2) , '',
td = STR(FreeSize*1.0/1024,6,2) , '',
td = STR(( TotalSize - FreeSize)*1.0/(TotalSize)* 100.0,6,2), '',
td = STR(( FreeSize * 1.0/ ( TotalSize ) ) * 100.0,6,2) , ''
FROM #DiskCapacity
FOR XML PATH('tr'), TYPE ) AS NVARCHAR(MAX) ) + N'</table></html>' ;
不错!