2012-07-20 8 views
6

SQL Server 2008のTSQLクエリでXML出力の一部を照合しようとしています。私は一致しているXMLは、アイテムのリストを返すことができます。リストはノード名ではなく属性名で識別されます。TSQL FOR XML Pathによって作成されたElementNodeに属性を追加します

XMLパス関数はラッパーノードを返しますが、そのノードに属性を追加する方法が見つかりません。私の場合は、彼らが選択したテーブル名に基づいてハードコードされた値になります。

2つのリストを分離しておくために、そこに「x」として「x」があります。私の実際のデータでは、これらは異なるノードにあるので問題はありません。問題は、単に「リスト」ノードに属性を追加する方法です。ここで

SQL Fiddle page for the example belowです:

サンプル・スキーマ

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

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

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

サンプル

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 

実際の出力

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

所望の出力を選択します(「Nを追加しますame "属性をリストラッパーに追加します)。

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

答えて

5

これは正しく出力されるようです。 Listノードに属性を追加するには、XML PATHの追加レベルが必要です。

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; 
関連する問題