2012-10-04 5 views
2

SQL Server 2008을 사용 중이고 FOR XML과 함께 EXPLICIT 모드를 사용하여 사용자 지정 xml을 생성하려고합니다.FOR XML을 사용하는 SQL Server EXPLICIT 모드

나는 많은 관계로 하나 가지고 다음 쿼리를

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 

enter image description here

나는 사람들이 많은 관계로 하나를 가지고 해결하기 때문에 여러 수 있습니다 자식으로 부모와 주소와 같은 사람을 원한다.

나는 다음과 같이이 사람과 깨진 XML은 확실히 내 코드 문제 몇 가지가 중첩되어

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 

출력 다음 쿼리를 썼다.

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

나를 도와주세요!

답변

8

도랑을 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 on MSDN에 대해 자세히 알아보십시오.

+0

도움을 주셔서 감사합니다. 명시 적 모드가 좋습니다. –

1

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