2013-03-19 76 views
1

我想从2005和2008R2 SQL Server中获取以XML格式返回的一些数据。我有两张桌子 - 一个主人和一个细节。我希望XML给出主信息,并在其中查询查询的每个主记录的详细信息(如果存在)。如果没有详细信息存在,它应该返回一个空节点而不是任何东西。例如,当详细记录存在,我想这一点:SQL Server 2008 XML空节点

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

当NO详细记录存在,我想这一点:

<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'); 

回答

3

我从问其他网站上同样的问题,得到的回答有(http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_28071909.html) “PortletPaul”。对于那些没有一个帐户在那里,该解决方案是使用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 />但它的足够近。