MS SQL查询输出XML时<CustomInteger>重复标签生成问题求助
方案1:子查询独立生成CustomInteger节点
该写法直观易懂,适合固定少量自定义字段的场景:
SELECT ( SELECT '2701' AS FieldID, CAST(RegisteredHours AS INT) AS Value FOR XML PATH('CustomInteger'), TYPE ), ( SELECT '2704' AS FieldID, CAST(CreditsAttempted AS INT) AS Value FOR XML PATH('CustomInteger'), TYPE ), ( SELECT '2705' AS FieldID, CAST(CreditsEarned AS INT) AS Value FOR XML PATH('CustomInteger'), TYPE ) FROM Student FOR XML PATH('CustomIntegers'), TYPE
逻辑说明:
- 每个
<CustomInteger>由单独的子查询生成,PATH('CustomInteger')指定每组FieldID和Value的外层标签,避免多个字段合并到同一个CustomInteger节点下 TYPE关键字保证子查询返回原生XML格式,不会被转义为普通字符串- 外层
PATH('CustomIntegers')将所有CustomInteger节点包裹到统一父标签中
方案2:行转列后批量生成节点
该写法扩展性更强,适合自定义字段数量较多、或需要动态配置FieldID的场景:
SELECT t.FieldID, CASE t.FieldID WHEN '2701' THEN CAST(s.RegisteredHours AS INT) WHEN '2704' THEN CAST(s.CreditsAttempted AS INT) WHEN '2705' THEN CAST(s.CreditsEarned AS INT) END AS Value FROM Student s CROSS JOIN (VALUES ('2701'),('2704'),('2705')) t(FieldID) FOR XML PATH('CustomInteger'), ROOT('CustomIntegers'), TYPE
逻辑说明:
- 通过
CROSS JOIN将每个学生的一行数据扩展为3行,每行对应一个自定义字段 - 每一行数据自动对应一个
<CustomInteger>节点,直接通过PATH('CustomInteger')生成 ROOT('CustomIntegers')直接指定所有CustomInteger的外层父标签
如果需要在所有学生数据外层再加统一根节点,可在外层FOR XML部分增加ROOT('自定义根节点名')参数即可。
内容的提问来源于stack exchange,提问作者RAR
相关产品推荐
相关产品推荐

