SQL Server 2012中使用FOR XML实现PART_NO嵌套SUPPLIER_PART_NO
在SQL Server 2012中用FOR XML实现嵌套XML输出
刚好我之前也处理过类似的需求,针对你的场景,用FOR XML PATH结合子查询就能完美实现你要的嵌套XML结构。先确认下你的数据源结构:
| PART_NO | SUPPLIER_PART_NO |
|---|---|
| AAA | 1 |
| AAA | 2 |
| BBB | 3 |
| BBB | 4 |
| BBB | 5 |
你想要的输出大概是这样的嵌套结构:
<root> <item PartNo="AAA"> <SupplierPartNo>1</SupplierPartNo> <SupplierPartNo>2</SupplierPartNo> </item> <item PartNo="BBB"> <SupplierPartNo>3</SupplierPartNo> <SupplierPartNo>4</SupplierPartNo> <SupplierPartNo>5</SupplierPartNo> </item> </root>
直接上可用的SQL查询,记得把YourTableName替换成你实际的表名:
SELECT PART_NO AS '@PartNo', -- 将PART_NO作为item节点的属性 -- 子查询生成当前PART_NO对应的所有SupplierPartNo节点 (SELECT SUPPLIER_PART_NO AS 'text()' FROM YourTableName t2 WHERE t2.PART_NO = t1.PART_NO FOR XML PATH('SupplierPartNo'), TYPE) FROM YourTableName t1 GROUP BY PART_NO -- 按PART_NO分组,确保每个PART_NO只生成一个item节点 FOR XML PATH('item'), ROOT('root') -- 包装成item节点,并添加root根节点
简单解释下逻辑:
- 主查询通过
GROUP BY PART_NO确保每个零件号只生成一个<item>父节点,同时用AS '@PartNo'把零件号设置为节点属性。 - 子查询针对每个父节点的PART_NO,筛选出所有对应的供应商零件号,用
FOR XML PATH('SupplierPartNo')生成一个个<SupplierPartNo>子节点,TYPE参数是关键,它能让子查询的XML结果正确嵌套到主结构里,而不是被转义成文本。 - 最后主查询的
FOR XML PATH('item'), ROOT('root')负责把所有item节点包裹在<root>根节点下,形成你要的完整结构。
内容的提问来源于stack exchange,提问作者Ritchie B
相关产品推荐
相关产品推荐

