您的位置:首页 > 数据库

知方可补不足~SQL巧用XML PATH来生成符合规则的查询结果集

2012-03-13 13:25 253 查看
回到目录

在查询后面在

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 中东,

回到目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐