1

我正在尝试从 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');
4

1 回答 1

3

我在另一个网站上问过同样的问题,并从“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>

这不是<details />我想要的,但它足够接近。

于 2013-03-21T16:41:29.600 回答