Режим SQL Server EXPLICIT с 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>
Может кто-нибудь, пожалуйста, помогите мне!
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.
Для правильного использования 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