【问题标题】:How to display empty XML tag in MS SQL Server如何在 MS SQL Server 中显示空 XML 标记
【发布时间】:2021-06-09 07:39:01
【问题描述】:

我需要将我的数据导出为 XML 格式。为简单起见,假设我有一个表 Employee,其中包含 FName、MName 和 LName 列。要将数据导出为 XML,我编写了以下查询

SELECT FName, MName, LName from Employee FOR XML PATH ('Emp Details'), ROOT ('Details');

这会以正确的 XML 格式返回数据。但是,如果有任何行具有 NULL 值,它会跳过该列的 XML 标记。就像在下面的示例中,MName 有一个 NULL 值,因此 XML 中也缺少 MName 的标记:-

<Emp Details>
  <Details>
    <FName>Rohit</Fname>
    <LName>Kumar</LName>
  </Details>
</Emp Details>

我尝试过使用ELEMENTS XSINIL 方法,但它显示的标签类似于

<MName xsi:nil="true" />

但是,我希望它显示为

<MName />

是否可以以这种方式显示 NULL 值 XML 标签? 谢谢

【问题讨论】:

  • 改用'',这将强制显示节点。所以ISNULL(MName,'') 会强制节点出现,但是是空白的。

标签: sql sql-server xml tsql


【解决方案1】:

如果你想在结果中有一个空的MName元素,只需在select语句中将NULL值转换为一个空字符串:

SELECT  FName, coalesce(MName, '') as MName, LName
from Employee
FOR XML PATH ('Emp Details'), ROOT ('Details');

coalesce 是将 NULL 值转换为某种东西的 ANSI 标准方法,SQL Server 接受这一点以及 SQL Server 特定的IsNull

【讨论】:

    【解决方案2】:

    正如我在 cmets 中提到的,用 ISNULL 包装该值以返回一个空白字符串:

    SELECT Fname,
           LName,
           ISNULL(MName,'') AS MName
    FROM (VALUES('Rohit','Kumar',NULL))V(FName,LName,MName)
    FOR XML PATH('Details'),ROOT('EmpDetails'); --Nodes can't have spaces in their names
    

    这将返回以下 XML:

    <EmpDetails>
        <Details>
            <Fname>Rohit</Fname>
            <LName>Kumar</LName>
            <MName></MName>
        </Details>
    </EmpDetails>
    

    请注意,SQL Server 不会使用较短的语法生成空白节点,它会显式打开和关闭标签。

    【讨论】:

    • 谢谢,它现在可以工作了。但是我们可以将空标签限制为&lt;MName/&gt;。尽管我相信,XML 认为两者是一样的。
    • @Kartikeya 我在答案中解决了这个问题。
    猜你喜欢
    • 2019-12-03
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    相关资源
    最近更新 更多