6

SQL Server2008TSQLクエリの一部のXML出力を一致させようとしています。照合しているXMLは、アイテムのリストを返すことができます。リストは、ノード名ではなく、属性名で識別されます。

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

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

以下の例のSQLフィドルページは次のとおりです。

サンプルスキーマ

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>

必要な出力:(「Name」属性をリストラッパーに追加します。)

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

1 に答える 1

5

これにより、正しい出力が得られるようです。XML PATH属性を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;
于 2012-07-21T07:23:53.433 に答える