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>' ; 

不错!

 

posted @ 2016-06-20 10:17  那就让我这样吧  阅读(487)  评论(0编辑  收藏  举报