如何从SQL数据生成单根<Units>节点的指定格式XML?
如何修正SQL语句生成正确包裹的XML格式?
你的问题出在FOR XML PATH ('UNITS')的用法上——这个参数是指定每一行数据对应的外层节点名,所以每一条UNIT记录都会被单独套一个<Units>节点,这就导致了你看到的重复根节点问题。
要生成单个<Units>根节点包裹所有<Unit>子节点的格式,有两种简单的修正方式:
方法1:嵌套子查询+外层指定根节点
把你的查询作为子查询,内层用PATH('')让所有<Unit>直接拼接,外层再用PATH('Units')生成统一的根节点:
SELECT ( SELECT DISTINCT PA.KOD_KRESKOWY AS Unit -- 注意别名改为Unit,匹配你期望的节点名大小写 FROM LISTY_LINIOWE_POZ_P AS LLPP INNER JOIN PACZKI AS PA ON PA.ID_PACZKI = LLPP.PACZKI_ID WHERE LISTY_LINIOWE_ID = 616665 FOR XML PATH ('') ) FOR XML PATH ('Units'), TYPE
方法2:使用ROOT选项更简洁
直接在原查询中用ROOT('Units')指定根节点,同时把PATH参数设为你想要的子节点名Unit:
SELECT DISTINCT PA.KOD_KRESKOWY AS Unit FROM LISTY_LINIOWE_POZ_P AS LLPP INNER JOIN PACZKI AS PA ON PA.ID_PACZKI = LLPP.PACZKI_ID WHERE LISTY_LINIOWE_ID = 616665 FOR XML PATH ('Unit'), ROOT('Units'), TYPE
这两种方法都会生成你期望的格式:
<Units> <Unit>0111024626914331</Unit> <Unit>0111024626914348</Unit> <Unit>00273129808000257576</Unit> <Unit>00273129808000257590</Unit> </Units>
另外注意:如果需要严格匹配你示例中的<Unit>节点大小写,一定要把SQL里的别名从UNIT改成Unit,SQL Server会根据别名的大小写生成对应的XML节点名(取决于你的数据库排序规则是否区分大小写,不过显式指定更稳妥)。
内容的提问来源于stack exchange,提问作者kinimord
相关产品推荐
相关产品推荐

