3

T-SQL を使用して XML データ内の複数のノードに対してクエリを実行し、結果を単一のコンマ区切り文字列に出力するにはどうすればよいですか?

たとえば、次の XML で「ドイツ、フランス、イギリス、イタリア、スペイン、ポルトガル」のようなすべての目的地名のリストを取得したいと考えています。

    <Holidays>
      <Summer>
        <Regions>
        <Destinations>
          <Destination Name="Germany"  />
          <Destination Name="France"  />
          <Destination Name="UK"  />
          <Destination Name="Italy"  />
          <Destination Name="Spain"  />
          <Destination Name="Portugal"  />
        </Destinations>
        <Regions>
      </Summer>
    </Holidays>

私は次のようなことを試みていました:

Countries = [xmlstring].value('/Holidays/Summer/Regions/Destinations/@Name', 'varchar')   
4

1 に答える 1

3

まず、ソース XML テーブルからレコードのリストを取得するには、.nodes関数 ( DEMO )を使用する必要があります。

select Destination.value('data(@Name)', 'varchar(50)') as name
from [xmlstring].nodes('/Holidays/Summer/Regions/Destinations/Destination')
    D(Destination)

出力例:

|      NAME |
-------------
|   Germany |
|    France |
|        UK |
|     Italy |
|     Spain |
|  Portugal |

ここから、宛先値をカンマ区切りのリストに連結します。残念ながら、これは T-SQL で直接サポートされていないため、何らかの回避策を使用する必要があります。複数の行を使用してソース テーブルを操作している場合、最も簡単な方法がFOR XML PATH('')トリックです。このクエリでは、 というソース テーブルを使用Dataし、XML を個別のレコードに分割してから、CROSS APPLYカンマFOR XML PATH('')区切りの行を生成します。最後に、リスト ( DEMO ),を作成するために結果から final が取り除かれます。

;with Destinations as (
    select id, name
    from Data
    cross apply (
        select Destination.value('data(@Name)', 'varchar(50)') as name
        from [xmlstring].nodes('/Holidays/Summer/Regions/Destinations/Destination') D(Destination)
    ) Destinations(Name)
)
select id, substring(NameList, 1, len(namelist) - 1)
from Destinations as parent
cross apply (
    select name + ','
    from Destinations as child
    where parent.id = child.id
    for xml path ('')
) DestList(NameList)
group by id, NameList

サンプル出力 (より複雑な例を作成するために、別の XML フラグメントをテスト データに追加したことに注意してください):

| ID |                               COLUMN_1 |
-----------------------------------------------
|  1 | Germany,France,UK,Italy,Spain,Portugal |
|  2 |                   USA,Australia,Brazil | 
于 2013-02-27T15:43:30.257 に答える