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

按预定架构导出MSSQL表为XML文件时的结果重复问题

解决MSSQL生成XML时重复表头的问题

你的查询出现DOCNUM和CARDNAME重复的核心原因:原查询直接遍历NiceTable的所有行,表中每条明细数据都会生成一个<Factura>节点,导致同一单据的表头信息被重复输出。

要实现你期望的XML结构,需要先对单据头信息进行分组,确保每个单据只生成一个<Factura>节点,再为每个单据关联对应的明细数据。以下是修正后的SQL查询:

SELECT
    -- 生成单单据头Antet
    (SELECT DOCNUM, CARDNAME FOR XML PATH('Antet'), TYPE)
    -- 生成单据明细Detalii
    ,(SELECT
        (SELECT ITEMCODE, QUANTITY FROM NiceTable t2 
         WHERE t2.DOCNUM = t1.DOCNUM 
         FOR XML PATH('Linie'), TYPE, ROOT('Continut'))
     FOR XML PATH('Detalii'), TYPE)
FROM (
    -- 先获取唯一的单据头组合
    SELECT DISTINCT DOCNUM, CARDNAME 
    FROM NiceTable
) t1
FOR XML PATH('Factura'), TYPE, ROOT('Facturi')

代码说明:

  1. 分组获取唯一单据头:子查询SELECT DISTINCT DOCNUM, CARDNAME FROM NiceTable提取出所有不重复的单据编号和客户名称,每个组合对应一个<Factura>节点,从根源避免表头重复。
  2. 生成Antet节点:针对每个唯一的单据头,生成包含DOCNUM和CARDNAME的<Antet>节点,确保每个单据只输出一次表头。
  3. 生成Detalii节点:通过关联当前单据的DOCNUM,查询该单据下的所有明细行,生成多个<Linie>节点并包裹在<Continut>和<Detalii>中,实现明细的聚合。

执行上述查询后,生成的XML结构将完全符合你的预期:每个<Factura>仅包含一个<Antet>,并对应该单据的所有<Linie>明细。

内容的提问来源于stack exchange,提问作者a3des

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 02:20:38