zoukankan      html  css  js  c++  java
  • 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-0px 1px 1px 0px; padding:4px 0px;}'
                +   N' table {border:1px solid #9ec9ec; 100%;border-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>' ; 

    不错!
  • 相关阅读:
    web.xml中openEntityManagerInViewFilter的作用(转)
    JNDI解读(转)
    Java读取大文件的高效率实现
    快速入门react
    谈一谈我所了解的https
    漫谈JWT
    Java 中的几种线程池这么用才是对的
    用Vue来实现图片上传多种方式
    一个页面从输入URL到页面加载显示完成,这个过程都发生什么?
    “===”与“==”的区别
  • 原文地址:https://www.cnblogs.com/niuzaihenmang/p/5599778.html
Copyright © 2011-2022 走看看