You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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')

代码说明

  1. 最内层查询:对每个vKey分组下的记录,生成以vCod为属性名、amount为属性值的片段,用FOR XML PATH('')合并为无节点的属性集合,再通过.query()将这些属性包装到<vCod>节点中。
  2. 中间层查询:按vKey分组,生成带有key属性的<Group>节点,并嵌入内层生成的<vCod>节点。
  3. 最外层查询:将所有<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:16:02