2012-07-20 10 views
6

Ich versuche, einige XML-Ausgabe in einer SQL Server 2008 TSQL-Abfrage übereinstimmen. Die XML-Datei, die ich abgleiche, kann Listen mit Elementen zurückgeben. Die Listen werden anhand des Attributnamens - nicht des Knotennamens - identifiziert.Attribut zu ElementNode hinzufügen erstellt von TSQL FOR XML-Pfad

Die XML-Pfadfunktionen geben einen Wrapper-Knoten zurück, aber ich finde keine Möglichkeit, diesem Knoten Attribute hinzuzufügen. In meinem Fall handelt es sich um fest codierte Werte, die auf dem Tabellennamen basieren, für den sie ausgewählt wurden.

Ich habe das 'x' als 'x' drin, um die zwei Listen getrennt zu halten. In meinen tatsächlichen Daten ist das kein Problem, da diese sich in verschiedenen Knoten befinden. Das Problem besteht nur darin, wie Attribute zum Knoten "List" hinzugefügt werden.

ist hier ein SQL Fiddle page for the example below:

Beispielschema

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

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

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

Probe

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 

Actual

Ausgang wählen
<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> 

gewünschte Ausgabe: (die „N Hinzufügen ame "Attribut für den Listenwrapper.)

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

Antwort

5

Dies scheint die richtige Ausgabe zu geben. Eine zusätzliche Ebene der Verschachtelung XML PATH ist erforderlich, um das Attribut auf den Knoten List zu bekommen:

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; 
Verwandte Themen