2012-07-20 15 views
6

Estoy tratando de hacer coincidir algunos resultados XML en una consulta SQL Server 2008 TSQL. El XML que estoy haciendo corresponder puede devolver listas de elementos. Las listas se identifican por nombre de atributo, no por nombre de nodo.Agregar atributo a ElementNode creado por TSQL FOR XML Path

Las funciones de ruta XML devolverán un nodo contenedor pero no puedo encontrar la manera de agregar atributos a ese nodo. En mi caso, serán valores codificados con base en el nombre de la tabla con la que estoy ejecutando contra la que seleccionan.

Tengo la 'x' como 'x' para mantener separadas las dos listas. En mis datos reales eso no es un problema ya que están en diferentes nodos. El problema es cómo agregar atributos al nodo "Lista".

Aquí es una SQL Fiddle page for the example below:

esquema de ejemplo

create table Table1 (Value varchar(50)); 
create table Table2 (Value varchar(50)); 

insert Table1 values 
('A'), ('B'), ('C'); 

insert Table2 values 
('X'), ('Y'), ('Z'); 

selecta muestra

select 
(
select Value as '@I' 
from Table1 
for XML PATH('L'), TYPE 
) as List, 
'x' as 'x', -- needed to keep the Lists apart. 
(
select Value as '@I' 
from Table2 
for XML PATH('L'), TYPE 
) as List 

for XML PATH 

de salida real

<row> 
    <List> 
    <L I="A"/> 
    <L I="B"/> 
    <L I="C"/> 
    </List> 

    <x>x</x> 

    <List> 
    <L I="X"/> 
    <L I="Y"/> 
    <L I="Z"/> 
    </List> 
</row> 

salida deseada: (Adición de la "N ame "atributo al contenedor de lista.)

<row> 
    <List Name='Table1'> <!-- Added Attribute "Name" here --> 
    <L I="A"/> 
    <L I="B"/> 
    <L I="C"/> 
    </List> 

    <x>x</x> 

    <List Name='Table2'> <!-- Added Attribute "Name" here --> 
    <L I="X"/> 
    <L I="Y"/> 
    <L I="Z"/> 
    </List> 
</row> 

Respuesta

5

Esto parece dar la salida correcta. Se requiere un nivel adicional de XML PATH anidación para obtener el atributo en el nodo List:

SELECT 
(SELECT 'Table1' AS '@name', 
    (SELECT Value AS '@I' 
    FROM Table1 
    FOR XML PATH ('L')) 
FOR XML PATH('List'), TYPE) 
,'x' AS'x' 
,(SELECT 'Table2' AS '@name', 
    (SELECT Value AS '@I' 
    FROM Table2 
    FOR XML PATH ('L')) 
FOR XML PATH('List'), TYPE 
) 

FOR XML PATH; 
Cuestiones relacionadas