我正在尝试从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');
答案 0 :(得分: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 />
,但它足够接近。