SQL Server FOR XML:如何生成按vKey分组、vCod为属性的XML?
用SQL Server FOR XML实现分组XML输出的解决方案
原代码问题分析
你的原SQL代码直接对每条记录生成<Root>节点,既没有做分组处理,也没有将vCod值动态转换为<vCod>节点的属性名,所以输出的是平级的多条<Root>,完全不符合按vKey分组、每个分组下聚合属性的需求。
实现需求的SQL代码
要实现按vKey分组,将每组内的vCod作为属性、amount作为属性值的XML结构,需要嵌套使用FOR XML,先分组再聚合属性:
declare @t table (vKey int, vCod varchar(4) , amount decimal(16,2) ) insert @t values ( 1 , 'v110' , 12.34 ) insert @t values ( 1 , 'v115' , 18.40 ) insert @t values ( 1 , 'v120' , 2.55 ) insert @t values ( 2 , 'v110' , 22.33 ) insert @t values ( 2 , 'v120' , 8.05 ) insert @t values ( 3 , 'v120' , 13.23 ) insert @t values ( 3 , 'v125' , 28.05 ) insert @t values ( 3 , 'v130' , 44.00 ) -- 外层构造Root节点,内层按vKey分组生成Group节点 select ( select vKey as '@key', -- 嵌套查询生成每组的vCod节点,聚合所有属性 ( select vCod as '@*', amount as 'text()' from @t t2 where t2.vKey = t1.vKey for xml path(''), type ).query('element vCod {./@*}') from @t t1 group by vKey for xml path('Group'), type ) for xml path('Root')
代码说明
- 最内层查询:对每个
vKey分组下的记录,生成以vCod为属性名、amount为属性值的片段,用FOR XML PATH('')合并为无节点的属性集合,再通过.query()将这些属性包装到<vCod>节点中。 - 中间层查询:按
vKey分组,生成带有key属性的<Group>节点,并嵌入内层生成的<vCod>节点。 - 最外层查询:将所有
<Group>节点包装到<Root>节点中。
输出结果(修正笔误后)
执行上述代码后,会生成符合需求的XML(你期望的XML中v110="12.24"是笔误,实际应为原数据的12.34):
<Root> <Group key="1"> <vCod v110="12.34" v115="18.40" v120="2.55" /> </Group> <Group key="2"> <vCod v110="22.33" v120="8.05" /> </Group> <Group key="3"> <vCod v120="13.23" v125="28.05" v130="44.00" /> </Group> </Root>
内容的提问来源于stack exchange,提问作者user1803870
相关产品推荐
相关产品推荐

