SQL FOR XML EXPLICIT生成带指定id属性的Attribute节点求助
为FOR XML EXPLICIT生成的节点添加指定id属性的解决方案
嘿,ALEN!我看你已经用FOR XML EXPLICIT走了大半路,就差给
问题根源
你原来的#colors表只存了颜色值,没有对应每个
修改后的完整SQL代码
-- 清理临时表(避免重复执行报错) IF OBJECT_ID('tempdb..#sample') IS NOT NULL DROP TABLE #sample IF OBJECT_ID('tempdb..#colors') IS NOT NULL DROP TABLE #colors -- 构建样本产品表 SELECT 1487997 as ExternalId, 'This is a name' as [Name] INTO #sample -- 构建颜色表,新增AttributeId列对应要生成的id属性值 SELECT 1487997 as ExternalId, 'Green' as [Color], 'BV_FE_FAMILY' as AttributeId INTO #colors UNION ALL SELECT 1487997 as ExternalId, 'BV_FE_FAMILY:Green' as [Color], 'BV_FE_EXPAND' as AttributeId -- 用FOR XML EXPLICIT生成目标XML SELECT 1 as Tag, NULL as Parent, NULL AS [EliminaTAG!1], -- 根元素 NULL AS [Product!2!ExternalId!element], NULL AS [Product!2!Name!cdata], NULL AS [Product!2!] UNION ALL SELECT 2 AS Tag, 1 AS Parent, NULL, ExternalId, [Name], -- 修改子查询:明确指定Attribute的id属性和Value元素 ( SELECT c.AttributeId as [@id], c.[Color] as Value FROM #colors c WHERE ff.ExternalId = c.ExternalId FOR XML PATH('Attribute'), ROOT('Attributes'), TYPE) FROM #sample ff FOR XML EXPLICIT
关键修改点
- 给#colors表添加AttributeId列:把每个颜色值和对应的目标id("BV_FE_FAMILY"、"BV_FE_EXPAND")绑定,这样生成XML时能精准对应。
- 子查询里声明id属性:用
[@id]语法告诉SQL Server,把AttributeId的值作为节点的属性,而不是子元素。这是PATH模式下生成节点属性的标准写法。
生成的XML结果
执行上面的代码后,你会得到符合预期的输出:
<EliminaTAG> <Product> <ExternalId>1487997</ExternalId> <Name><![CDATA[This is a name]]></Name> <Attributes> <Attribute id="BV_FE_FAMILY"> <Value>Green</Value> </Attribute> <Attribute id="BV_FE_EXPAND"> <Value>BV_FE_FAMILY:Green</Value> </Attribute> </Attributes> </Product> </EliminaTAG>
这样就完美实现了你想要的
内容的提问来源于stack exchange,提问作者ACaps
相关产品推荐
相关产品推荐

