sql >> データベース >  >> RDS >> Sqlserver

SQL サーバーの FOR XML PATH と [text()]

    他の現在の回答は、これがどこから来ているのかについてあまり説明していないか、フォーマットが不十分なサイトへのリンクを提供するだけで、質問に実際には答えていません.

    文字列をグループ化するためのWeb上の多くの回答には、何が起こっているのかについての多くの説明なしでコピーペーストの回答があります。私は同じことを考えていたので、この質問にもっとよく答えたいと思っていました。また、実際に全体的に何が起こっているのかについての洞察も提供したかったのです.

    tldr;

    つまり、これは FOR XML PATH を使用するときに XML 出力を変換するのに役立つ構文です。 列名 (またはエイリアス) を使用して出力を構成します。列に名前を付ける場合 text() データはルート タグ内のテキストとして表されます。

    <row>
        My record's data
    <row>
    

    オンラインで表示される例では、文字列をグループ化し、, で連結する方法について説明しています。 明らかではないかもしれません(クエリに for xml がほとんどないという事実を除いて) 一部) FOR XML PATH ('') を使用して、特定の構造を持つ (というより、むしろ構造のない) XML ファイルを実際に構築していること . ('') ルート xml タグを削除し、データを吐き出すだけです。

    AS [text()] との取引

    いつものように、AS 列のエイリアスに名前を付けたり、名前を変更したりしています。この例では、この列を [text()] としてエイリアスしています . [] s は単に SQL Server の標準の列区切り記号であり、列名に () が含まれているため、今日を除いて、多くの場合不要です。 秒。 text() が残ります

    列名による XML 構造の制御

    FOR XML PATH を使用している場合 XML ファイルを出力しており、列名で構造を制御できます。オプションの詳細なリストは、https://msdn.microsoft にあります。 .com/en-us/library/ms189885.aspx

    例には、次のように @ 記号で始まる列名が含まれます。

    SELECT color as '@color', name
    FROM #favorite_colors
    FOR XML PATH
    

    これにより、この列のデータが現在の xml 行の項目ではなく、その属性に移動されます。最終的に

    <row color="red">
      <name>tim</name>
    </row>
    <row color="blue">
      <name>that guy</name>
    </row>
    

    それでは、[text()] に戻ります。 .これは実際には XPath ノード テスト を指定しています。 . MS Sql Server のコンテキストでは、この指定について こちら .基本的に、通常のノード (デフォルト)、xml コメント、またはこの例ではタグ内のテキストなど、このデータを追加する要素のタイプを決定するのに役立ちます。

    出力を構造化するためにいくつかの動きを使用した例

    SELECT 
      color as [@color]
      ,'Some info about ' + name AS [text()]
      ,name + ' likes ' + color AS [comment()]
      ,name
      ,name + ' has some ' + color + ' things' AS [info/text()]
    FROM #favorite_colors
    FOR XML PATH
    

    列名にいくつかの名称を使用していることに注意してください:

    • @color :タグ属性
    • text() :このルート タグのテキスト
    • comment() :xml コメント
    • info/text() :特定の xml タグ <info> 内のテキスト

    出力は次のようになります:

    <row color="red">
        Some info about tim
        <!--tim likes red-->
        <name>tim</name>
        <info>tim has some red things</info>
    </row>
    <row color="blue">
        Some info about that guy
        <!--that guy likes blue-->
        <name>that guy</name>
        <info>that guy has some blue things</info>
    </row>
    

    まとめとして、これらのツールはどのように文字列をグループ化および連結できますか?

    したがって、FOR XML PATH を使用して文字列をグループ化するための解決策を見てみましょう。 、2 つの重要なコンポーネントがあります。

    • AS [text()] :データをタグで囲むのではなく、テキストとして書き込みます
    • FOR XML PATH ('') :ルート タグの名前を '' に変更します 、というか、完全に削除します

    これにより、基本的に単なる文字列である "XML" (エア クォート) 出力が得られます。

    SELECT name + ', ' AS [text()] -- no 'name' tags
    FROM #favorite_colors
    FOR XML PATH ('')  -- no root tag
    

    戻る

    tim, that guy, 
    

    そこから、そのデータを元の大きなデータセットに結合するだけです。



    1. MariaDBにすべてのストアドプロシージャを一覧表示する方法

    2. MySQLでソーシャルネットワークシステムのデータベースを設計するためのガイド

    3. Cloud SQL Postgres jdbc:postgres://google/に適したドライバーが見つかりません

    4. 各グループで最高