2011-05-24 7 views
5

Intentando escribir una consulta XML de SQL Server 2008. He simplificado mi ejemplo aquí, pero teniendo en cuenta estos datos:Salida de XML anidado en SQL Server 2008

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>') 

que necesito para generar archivos XML que tiene este aspecto:

<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> 

Esta consulta hace eso:

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') 

Sin embargo , Tengo problemas cuando uno de los padres tiene una fila adicional en la tabla de información secundaria. Agregue esta fila a la tabla:

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

Y mi consulta explota diciendo que la subconsulta arroja más de 1 valor. Necesito manejar este escenario. ¿Alguien sabe cómo resolver?

Gracias.

+1

¿Por qué su tabla '# childinfo' contiene un fragmento XML ya? Sería ** mucho más fácil ** si tuviera solo una tabla secundaria normal con algunos campos, y no un XML ya ... –

Respuesta

9

Si tuviera una tabla secundaria "regular" - con sólo un nombre para el niño - y no un fragmento de XML, puede utilizar esta consulta para obtener exactamente lo que está buscando:

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') 

La salida resultante es:

<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

¿Qué pasa si necesito anidar toda la salida dentro de ' .... ca9163d9

6
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') 

Resultado:

<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 respuesta no marcada, ¿por qué? – Kiquenet

Cuestiones relacionadas