Режим EXPLICIT SQL Server с FOR XML

Я использую SQL Server 2008 и пытаюсь создать собственный xml, используя режим EXPLICIT с FOR XML.

У меня есть отношение «один ко многим», имеющее следующий запрос

select  
    p.personid, p.firstname, a.P_City 
from 
    tblPeople p with (nolock) 
left outer join 
    tblAddresses a with (nolock) on p.personid = a.personid 
where 
    p.personid = 120773

введите здесь описание изображения

Я хочу, чтобы человек как родитель и адрес как ребенок могли быть несколькими, потому что люди, к которым нужно обращаться, имеют отношение один ко многим.

Я написал следующий запрос

 select 1 as TAG,
        null as parent, 
        p.personid as [person!1!personid],
        p.FirstName as [person!1!firstname],

        null as [addr!2!] 
        from tblPeople p with (nolock) where p.PersonID in (120773,117396)

        union all 

select 2,1, 
        p.PersonID, p.FirstName, a.P_City from tblAddresses a with(nolock), tblPeople p 
        where p.PersonID=a.PersonID and p.PersonID in (120773,117396)

        for xml explicit

Вывод выглядит следующим образом: это сломанный xml с вложенным человеком, наверняка что-то не так с моим кодом.

<person personid="117396" firstname="David"/>
    <person personid="120773" firstname="Doyle">
        <addr>Mount Rainier</addr>
        <addr>Annapolis</addr>
</person>

Может кто-нибудь, пожалуйста, помогите мне!!!


person d-man    schedule 04.10.2012    source источник


Ответы (2)


Я бы порекомендовал отказаться от FOR XML EXPLICIT и использовать вместо него FOR XML PATH/ROOT.

Используя этот запрос здесь:

select  
    p.personid AS "@ID", 
    p.firstname, p.LastName,
    (
        SELECT AddressID AS "@ID", City
        FROM dbo.Address a 
        WHERE a.PersonID = p.PersonID
        FOR XML PATH('addr'), TYPE
    ) AS Addresses
from 
    Person p with (nolock) 
where 
    p.personid = 120773
FOR XML PATH('Person'), ROOT('People')

вы получите этот выходной XML:

<People>
  <Person ID="120773">
    <firstname>John</firstname>
    <LastName>Doyle</LastName>
    <Addresses>
      <addr ID="1">
        <City>Annapolis</City>
      </addr>
      <addr ID="2">
        <City>Mount Rainier</City>
      </addr>
    </Addresses>
  </Person>
</People>

Настройте его по мере необходимости. Дополнительные сведения о FOR XML PATH см. в MSDN.

person marc_s    schedule 04.10.2012
comment
Спасибо за помощь, явный режим отстой. - person d-man; 05.10.2012

Для правильного использования FOR XML EXPLICIT принцип ORDER BY является основополагающим. Проверь это

select 1 as TAG,
        null as parent, 
        p.personid as [person!1!personid],
        p.FirstName as [person!1!firstname],

        null as [addr!2!] 
        from tblPeople p with (nolock) where p.PersonID in (120773,117396)

        union all 

select 2,1, 
        p.PersonID, p.FirstName, a.P_City from tblAddresses a with(nolock), tblPeople p 
        where p.PersonID=a.PersonID and p.PersonID in (120773,117396)
ORDER BY [person!1!personid], [addr!2!] 
        for xml explicit
person Guillermo Cullen    schedule 10.10.2012