咨询:如何在SQL生成的XML中包含空白标签
在SQL Server的FOR XML查询中添加空白标签
嘿,我来帮你搞定在生成的XML里添加空白标签的问题!SQL Server的FOR XML PATH默认会忽略NULL值的列,不会生成对应的标签,所以要手动构造空标签的话,咱们可以用下面几种方法:
方法1:添加固定的空白成对标签
如果不管数据情况,都要在某个节点下加一个空标签(比如<ExtraInfo></ExtraInfo>),只需要在对应的SELECT子句里加上'' AS 标签名就行。比如在你的现有查询里修改:
SELECT CAST(( SELECT ( -- 在HD节点里添加<ExtraInfo>空标签 SELECT ICase, DPCRef, '' AS ExtraInfo FROM #HD HD WHERE HD.OrdRef=PICK.OrdRef GROUP BY ICase, DPCRef FOR XML PATH('HD'), TYPE ), ( -- 在LD节点里添加<Batch>空标签 SELECT PCode, SOLnNt, '' AS Batch, ( SELECT SSCCRef FROM #SSCC LM WHERE LD.OrdRef = LM.OrdRef AND LD.PCode=LM.PCode GROUP BY SSCCRef FOR XML PATH(''), ROOT('SSCC'), TYPE ) FROM #LD LD WHERE LD.OrdRef = PICK.OrdRef GROUP BY PCode, SOLnNt FOR XML PATH('LD'), TYPE ) FROM #PICK PICK GROUP BY OrdRef FOR XML PATH('PICK'), TYPE ) AS XML)
这样生成的XML里,每个<HD>节点都会带<ExtraInfo></ExtraInfo>,每个<LD>节点会带<Batch></Batch>。
方法2:生成自闭合的空标签(带xsi:nil标识)
如果你需要的是<Tag/>这种自闭合的空标签,并且可以接受带xsi规范的nil标识,那么可以用NULL AS 标签名,再加上ELEMENTS XSINIL选项。比如修改HD子查询:
SELECT ICase, DPCRef, NULL AS ExtraInfo FROM #HD HD WHERE HD.OrdRef=PICK.OrdRef GROUP BY ICase, DPCRef FOR XML PATH('HD'), TYPE, ELEMENTS XSINIL
这会生成类似这样的XML节点:
<HD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ICase>...</ICase> <DPCRef>...</DPCRef> <ExtraInfo xsi:nil="true"/> </HD>
方法3:条件性生成空白标签
如果只想在特定条件下生成空标签,可以用CASE语句控制生成逻辑:
SELECT ICase, DPCRef, -- 当DPCRef为空时生成空标签,否则不生成 CASE WHEN DPCRef IS NULL THEN '' ELSE NULL END AS EmptyTag FROM #HD HD WHERE HD.OrdRef=PICK.OrdRef GROUP BY ICase, DPCRef FOR XML PATH('HD'), TYPE
小提醒
- 添加的空标签列不需要加入
GROUP BY子句,因为空字符串是常量,不会影响分组结果 - 空白成对标签(
<Tag></Tag>)和自闭合标签在XML语义上是等价的,大部分解析器都会同等处理
内容的提问来源于stack exchange,提问作者Arun Kumar
相关产品推荐
相关产品推荐

