首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server EXPLICIT模式与FOR XML

SQL Server EXPLICIT模式与FOR XML
EN

Stack Overflow用户
提问于 2012-10-05 04:44:16
回答 2查看 15.8K关注 0票数 4

我使用的是SQL Server2008,我正在尝试用FOR XMLEXPLICIT模式生成一个自定义的xml。

我有一个一对多的关系,查询如下

代码语言:javascript
复制
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

我想要父母的人和孩子的地址可能是多个,因为人们的地址有一对多的关系。

我编写了以下查询

代码语言:javascript
复制
 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嵌套的破碎的xml肯定是我的代码出了问题。

代码语言:javascript
复制
<person personid="117396" firstname="David"/>
    <person personid="120773" firstname="Doyle">
        <addr>Mount Rainier</addr>
        <addr>Annapolis</addr>
</person>

有人能帮帮我吗!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-05 04:53:34

我建议你抛弃FOR XML EXPLICIT,转而使用FOR XML PATH/ROOT

在此处使用此查询:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<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的更多详细信息。

票数 11
EN

Stack Overflow用户

发布于 2012-10-11 00:46:14

为了正确使用For XML EXPLICIT,ORDER BY是基础。看看这个

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12735615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档