【问题标题】:SQL Server 2008 XML Empty NodeSQL Server 2008 XML 空节点
【发布时间】:2013-03-19 15:34:42
【问题描述】:

我正在尝试从 2005 和 2008R2 SQL Server 获取一些以 XML 格式返回的数据。我有两张桌子 - 一张主人和一张细节。我希望 XML 提供主信息以及查询的每个主记录的详细信息(如果存在)。如果不存在详细信息,它应该返回一个空节点而不是什么。例如,当存在详细记录时,我想要这个:

<masters>
  <master>
    <flda>value</flda>
    <fldb>value</fldb>
    <details>
      <detail>
        <dtla>value</dtla>
      </detail>
    </details>
  </master>
</masters>

当没有详细记录存在时,我想要这个:

<masters>
  <master>
    <flda>value</flda>
    <fldb>value</fldb>
    <details />
  </master>
</masters>

当有详细记录时,我有以下查询可以正确获取数据,但我不知道如何在缺少详细信息时强制一个空节点:

select m.flda, m.fldb,
       (select d.dtla
        from detail d
        where (d.mastid = m.id)
        for xml path('detail'), type) as 'details'
from master m
where (m.id = @id)
for xml path('master'), root('masters');

【问题讨论】:

    标签: sql-server xml


    【解决方案1】:

    我在另一个网站上问过同样的问题,并从“PortletPaul”那里得到了答案 (http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_28071909.html)。对于那些没有帐户的人,解决方案是使用 ISNULL 指令,如下所示:

    select m.flda, m.fldb,
       isnull((select *
               from detail d
               where (d.mastid = m.id)
               for xml path('detail'), type),'') as 'details'
    from master m
    where (m.id = @id)
    for xml path('master'), root('masters');
    

    这将为您提供以下内容:

    <masters>
      <master>
        <flda>value</flda>
        <fldb>value</fldb>
        <details></details>
      </master>
    </masters>
    

    这不是我想要的&lt;details /&gt;,但它已经足够接近了。

    【讨论】:

      猜你喜欢
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多