按预定架构导出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')
代码说明:
- 分组获取唯一单据头:子查询
SELECT DISTINCT DOCNUM, CARDNAME FROM NiceTable提取出所有不重复的单据编号和客户名称,每个组合对应一个<Factura>节点,从根源避免表头重复。 - 生成Antet节点:针对每个唯一的单据头,生成包含
DOCNUM和CARDNAME的<Antet>节点,确保每个单据只输出一次表头。 - 生成Detalii节点:通过关联当前单据的
DOCNUM,查询该单据下的所有明细行,生成多个<Linie>节点并包裹在<Continut>和<Detalii>中,实现明细的聚合。
执行上述查询后,生成的XML结构将完全符合你的预期:每个<Factura>仅包含一个<Antet>,并对应该单据的所有<Linie>明细。
内容的提问来源于stack exchange,提问作者a3des
相关产品推荐
相关产品推荐

