zoukankan      html  css  js  c++  java
  • FOR XML PATH 语句的应用【所有列值显示在一行中】

    原文发布时间为:2010-10-20 —— 来源于本人的百度文章 [由搬家工具导入]

    大家都知道在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据,下面是它的一些应用示例。
    复制代码 代码如下:
    DECLARE @TempTable table(UserID int , UserName nvarchar(50));
    insert into @TempTable (UserID,UserName) values (1,'a')
    insert into @TempTable (UserID,UserName) values (2,'b')

    select UserID,UserName from @TempTable FOR XML PATH
    运行这段脚本,将生成如下结果:
    复制代码 代码如下:
    <row>
    <UserID>1</UserID>
    <UserName>a</UserName>
    </row>
    <row>
    <UserID>2</UserID>
    <UserName>b</UserName>
    </row>

    大家可以看到两行数据生成了两个节点,修改一下PATH的参数:

    select UserID,UserName from @TempTable FOR XML PATH('lzy')
    再次运行上述脚本,将生成如下的结果:
    复制代码 代码如下:
    <lzy>
    <UserID>1</UserID>
    <UserName>a</UserName>
    </lzy>
    <lzy>
    <UserID>2</UserID>
    <UserName>b</UserName>
    </lzy>

    可以看到节点变成,其实PATH() 括号内的参数是控制节点名称的,这样的话大家可以看一下如果是空字符串(不是没有参数)会是什么结果?

    select UserID,UserName from @TempTable FOR XML PATH('')
    执行上面这段脚本将生成结果:
    复制代码 代码如下:
    <UserID>1</UserID>
    <UserName>a</UserName>
    <UserID>2</UserID>
    <UserName>b</UserName>

    这样就不显示上级节点了,大家知道在 PATH 模式中,列名或列别名被作为 XPath 表达式来处理,也就是说,是列的名字,这样大胆试验一下不给指定列名和别名会是怎么样?

    select CAST(UserID AS varchar) + '',UserName + '' from @TempTable FOR XML PATH('')
    运行上面这句将生成结果

    1a2b

    所有数据都生成一行,而且还没有连接字符,这样的数据可能对大家没有用处,还可以再变化一下:

    select CAST(UserID AS varchar) + ',',UserName + '',';' from @TempTable FOR XML PATH('')
    生成结果

    1,a;2,b;

    大家现在明白了吧,可以通过控制参数来生成自己想要的结果,例如:

    select '{' + CAST(UserID AS varchar) + ',','"' +UserName + '"','}' from @TempTable FOR XML PATH('')
    生成结果

    {1,"a"}{2,"b"}

    还可以生成其他格式,大家可以根据自己需要的格式进行组合。

    下面是一个数据统计的应用,希望大家可以通过下面的实例想到更多的应用
    复制代码 代码如下:
    DECLARE @T1 table(UserID int , UserName nvarchar(50),CityName nvarchar(50));
    insert into @T1 (UserID,UserName,CityName) values (1,'a','上海')
    insert into @T1 (UserID,UserName,CityName) values (2,'b','北京')
    insert into @T1 (UserID,UserName,CityName) values (3,'c','上海')
    insert into @T1 (UserID,UserName,CityName) values (4,'d','北京')
    insert into @T1 (UserID,UserName,CityName) values (5,'e','上海')

    SELECT B.CityName,LEFT(UserList,LEN(UserList)-1) FROM (
    SELECT CityName,
    (SELECT UserName+',' FROM @T1 WHERE CityName=A.CityName FOR XML PATH('')) AS UserList
    FROM @T1 A
    GROUP BY CityName
    )


    生成结果(每个城市的用户名)

    北京 b,d
    上海 a,c,e
    详细出处参考:http://www.jb51.net/article/23413.htm

  • 相关阅读:
    BestCoder6 1002 Goffi and Squary Partition(hdu 4982) 解题报告
    codeforces 31C Schedule 解题报告
    codeforces 462C Appleman and Toastman 解题报告
    codeforces 460C. Present 解题报告
    BestCoder3 1002 BestCoder Sequence(hdu 4908) 解题报告
    BestCoder3 1001 Task schedule(hdu 4907) 解题报告
    poj 1195 Mobile phones 解题报告
    二维树状数组 探索进行中
    codeforces 460B Little Dima and Equation 解题报告
    通过Sql语句控制SQLite数据库增删改查
  • 原文地址:https://www.cnblogs.com/handboy/p/7163949.html
Copyright © 2011-2022 走看看