SQL Server 2019 T-SQL生成含同名元素的XML方法问询
问题:在SQL Server 2019中生成包含同名子元素的XML结构
尝试用T-SQL创建包含两个同名<value>元素的XML,但现有方案不符合预期。
尝试的代码:
select 'A' as [Test/Route/Client/value], '', 'B' as [Test/Route/Client/value] for xml path('test'), type
实际得到的结果:
<test> <Test> <Route> <Client> <value>A</value> </Client> </Route> </Test> <Test> <Route> <Client> <value>B</value> </Client> </Route> </Test> </test>
期望的结果:
<test> <Test> <Route> <Client> <value>A</value> <value>B</value> </Client> </Route> </Test> </test>
如何实现这种类似数组的同名元素结构?
解决方案
你之前的写法中,空字符串会被当作新记录的分隔符,导致生成两个独立的<Test>节点。要在同一个<Client>下生成多个<value>元素,需要通过嵌套FOR XML PATH的方式,让同名元素归属到同一个父节点层级。
方法1:直接构造嵌套结构
SELECT ( SELECT 'A' AS value, '' AS [*], 'B' AS value FOR XML PATH('Client'), TYPE ) AS [Test/Route] FOR XML PATH('test'), TYPE
方法2:基于数据集生成(适合动态数据)
如果你的值来自表数据,可以先构造数据集再嵌套生成:
-- 模拟数据源 WITH ValueData AS ( SELECT 'A' AS val UNION ALL SELECT 'B' AS val ) SELECT ( SELECT val AS value FROM ValueData FOR XML PATH(''), TYPE ) AS [Test/Route/Client] FOR XML PATH('test'), TYPE
以上两种方法都会生成你期望的XML结构:
<test> <Test> <Route> <Client> <value>A</value> <value>B</value> </Client> </Route> </Test> </test>
核心逻辑是通过嵌套FOR XML PATH,将多个<value>元素包裹在同一个<Client>节点下,避免因空字符串分隔产生独立的父节点层级。
内容的提问来源于stack exchange,提问作者Dave28
相关产品推荐
相关产品推荐

