zoukankan      html  css  js  c++  java
  • 知方可补不足~SQL巧用XML PATH来生成符合规则的查询结果集

    回到目录

    在查询后面在

    FOR XML PATH可以生成XML格式结果集,好好利用这个技术,可以实现很多意想不到的查询效果

    最简单的用法:

    SELECT USERID,USERNAME FROM DBO.USER_INFO FOR XML PATH

    结果类似这样

    <row>
      <USERID>6</USERID>
      <USERNAME>ding25901</USERNAME>
    </row>
    <row>
      <USERID>10</USERID>
      <USERNAME>zhong</USERNAME>
    </row>
    <row>
      <USERID>11</USERID>
      <USERNAME>yanxunhan</USERNAME>
    </row>

    我们看到是以XML格式来显示的,注意它是个字符串,它只显示在一行上。

    可以为path加个参数,来改变row节点的名称,如

    SELECT USERID,USERNAME FROM DBO.USER_INFO FOR XML PATH('zzl')

    结果变成了这样

    <zzl>
      <USERID>6</USERID>
      <USERNAME>ding25901</USERNAME>
    </zzl>
    <zzl>
      <USERID>10</USERID>
      <USERNAME>zhong</USERNAME>
    </zzl>

    当然,发挥我们的想像力,可能也会出现这种结果

    {6,ding25901}{10,zhong}

    怎么样,有点像JSON的格式标准吧,看看代码:

    SELECT TOP 2
            '{' + CAST(UserID AS VARCHAR) + ',' ,
            userName + '' ,
            '}'
    FROM    dbo.User_Info
    FOR     XML PATH('')

    只要发挥你的想像力,就有你想不到的事情发生,如果没有xml path,可能我们还要用性能较低的游标

    看看这个例子,找出用户地址表中,所有用户的所有地址信息:

    SELECT  B.userid ,
            List
    FROM    ( SELECT    userid ,
                        ( SELECT    c.address + ','
                          FROM      dbo.UserAddress c
                          WHERE     c.UserID = a.userid
                        FOR
                          XML PATH('')
                        ) AS List
              FROM      dbo.UserAddress A
              GROUP BY  userid
            ) B

    结果是:

    userid                               addresslist
    ------------------------------------ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    010E3E9D-67F5-4C25-80A7-0B56D03F3427 日本,中国,
    062061EB-61F2-49A3-AA87-7BD5A59F5970 中国,美国,
    1A58A662-A3DF-4BEE-B0D0-B0F73846D55B 中东,

    回到目录

  • 相关阅读:
    [No000088]并行循环vs普通循环
    [No000087]Linq排序,SortedList排序,二分法排序性能比较
    [No000086]C#foreach集合被改变,报错处理方案
    [No000085]C#反射Demo,通过类名(String)创建类实例,通过方法名(String)调用方法
    [No000084]C# 使用Log4Net(1)-快速建立一个demo
    [No000082]Convert和Parse的区别/Convert.ToInt32()与int.Parse()的区别
    [No000081]SVN学习笔记1-服务端搭建
    [No00007F]2016-面经[下] 英文简历写作技巧
    [No00007E]2016-面经[中]
    [No00007D]2016-面经[上]
  • 原文地址:https://www.cnblogs.com/lori/p/2393663.html
Copyright © 2011-2022 走看看