在SQL Server 2008中输出嵌套的XML

问题描述:

尝试编写SQL Server 2008 XML查询。我在这里我简单的例子,但给定数据:在SQL Server 2008中输出嵌套的XML

create table #parentinfo (name varchar(50), city varchar(50), state varchar(50)) 
insert #parentinfo values ('joe', 'yonkers', 'ny') 
insert #parentinfo values ('sue', 'sacremento', 'ca') 

-- parentname is foreign key to name field in #parentinfo 
create table #childinfo (parentname varchar(50), childxml xml) 
insert #childinfo values ('joe', '<child>mary</child><child>ben</child>') 
insert #childinfo values ('sue', '<child>sally</child><child>roger</child>') 

我需要看起来像这样的输出XML:

<parentinfo> 
<parent> 
    <name>joe</name> 
    <city>yonkers</city> 
    <state>ny</state> 
    <children> 
     <child>mary</child> 
     <child>ben</child> 
    </children> 
</parent> 
<parent> 
    <name>sue</name> 
    <city>sacremento</city> 
    <state>ca</state> 
    <children> 
     <child>sally</child> 
     <child>roger</child> 
    </children> 
</parent> 
</parentinfo> 

这个查询请求也认为:

select name, 
    city, 
    state, 
    (select childxml 
    from #childinfo c 
    where c.parentname = p.name 
    --for xml auto, type, elements 
    ) as 'children' 
from #parentinfo p 
group by name, city, state 
for xml path('parent') 

然而,当其中一位父母在childinfo表中有额外的行时,我遇到问题。添加这一行到表格:

insert #childinfo values ('joe', '<child>chucky</child><child>pebbles</child>') 

而我的查询爆炸说子查询返回多个值。我需要处理这种情况。有谁知道如何解决?

谢谢。

+1

为什么你的'#childinfo'表持有一个XML片段?如果你只有一个带有一些字段的常规子表 - 并且已经不是XML,那么这将会**更容易** – 2011-05-24 16:30:29

如果你有一个“正规”的子表 - 只为孩子的名字 - 而不是一个XML片段,您可以使用此查询来获取你寻找什么:

create table #parentinfo (name varchar(50), city varchar(50), state varchar(50)) 
insert #parentinfo values ('joe', 'yonkers', 'ny') 
insert #parentinfo values ('sue', 'sacremento', 'ca') 

-- parentname is foreign key to name field in #parentinfo 
create table #childinfo (parentname varchar(50), childname VARCHAR(50)) 
insert #childinfo values ('joe', 'mary') 
insert #childinfo values ('joe', 'ben') 
insert #childinfo values ('sue', 'sally') 
insert #childinfo values ('sue', 'roger') 

insert #childinfo values ('joe', 'chucky') 
insert #childinfo values ('joe', 'pebbles') 

select name, 
    city, 
    state, 
    (select childname as 'child' 
    from #childinfo c 
    where c.parentname = p.name 
    order by childname 
    for xml PATH(''), type 
    ) as 'children' 
from #parentinfo p 
group by name, city, state 
for xml path('parent'), root('parentinfo') 

所得到的输出是:

<parentinfo> 
    <parent> 
    <name>joe</name> 
    <city>yonkers</city> 
    <state>ny</state> 
    <children> 
     <child>ben</child> 
     <child>chucky</child> 
     <child>mary</child> 
     <child>pebbles</child> 
    </children> 
    </parent> 
    <parent> 
    <name>sue</name> 
    <city>sacremento</city> 
    <state>ca</state> 
    <children> 
     <child>roger</child> 
     <child>sally</child> 
    </children> 
    </parent> 
</parentinfo> 
+0

如果我需要将整个输出嵌套在 .... ,可以在不为xml路径创建另一层'select ... from(.....)t'的路径('Output'),type'? – ca9163d9 2017-01-17 21:22:42

select name, 
    city, 
    state, 
    (select childxml as '*' 
    from #childinfo c 
    where c.parentname = p.name 
    for xml path(''), type 
    ) as 'children' 
from #parentinfo p 
group by name, city, state 
for xml path('parent') 

结果:

<parent> 
    <name>joe</name> 
    <city>yonkers</city> 
    <state>ny</state> 
    <children> 
    <child>mary</child> 
    <child>ben</child> 
    <child>chucky</child> 
    <child>pebbles</child> 
    </children> 
</parent> 
<parent> 
    <name>sue</name> 
    <city>sacremento</city> 
    <state>ca</state> 
    <children> 
    <child>sally</child> 
    <child>roger</child> 
    </children> 
</parent> 
+0

@ kt1未标记答案,为什么? – Kiquenet 2017-02-08 12:04:43