2013-03-19 4 views
1

Я пытаюсь получить некоторые данные, возвращенные в формате XML с SQL Server 2005 и SQL Server 2008 R2. У меня есть две таблицы - мастер и деталь. Я хочу, чтобы XML предоставил основную информацию, и в этом случае была запрошена подробная информация (если она существует) для каждой основной записи. Если нет подробной информации, она должна вернуть пустой узел NOT nothing. Например, когда существуют детальные записи, я хочу это:SQL Server 2008 XML Empty Node

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

ответ

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 />, что я хотел, но это достаточно близко.