3

2 つの異なる XML を組み合わせます。

たとえば、最初の部分の SQL は次のようになります。

SELECT
  *
FROM
  (
    SELECT 1 AS OrdNum, 'Abc'       AS Name
  ) a
FOR XML
  AUTO,
  TYPE

実行すると、次のようになります。

<a OrdNum="1" Name="Abc" />

2番目のものはここにあります:

SELECT
  *
FROM
  (
     SELECT 4  AS Age, 'M'  AS Sex,   'John'      AS FirstName
  ) b
FOR XML
  AUTO,
  TYPE

あなたはこれを得るでしょう:

<b Age="4" Sex="M" FirstName="John" />

次に、2 つの部分をまとめます。

SELECT
  *
FROM
  (

    SELECT
      (
        SELECT
          *
        FROM
          (
            SELECT 1 AS OrdNum, 'Abc'       AS Name
          ) a
        FOR XML
          AUTO,
          TYPE
      ) AS aa

      ,

      (
        SELECT
          *
        FROM
          (
             SELECT 4  AS Age, 'M'  AS Sex,   'John'      AS FirstName
          ) b
        FOR XML
          AUTO,
          TYPE
      ) AS bb

  ) Data
FOR XML
  AUTO,
  ELEMENTS

結果は次のとおりです。

<Data>
  <aa>
    <a OrdNum="1" Name="Abc" />
  </aa>
  <bb>
    <b Age="4" Sex="M" FirstName="John" />
  </bb>
</Data>

しかし、そこに要素「aa」と「bb」を入れたくありません。私はこれを手に入れたいです:

<Data>
  <a OrdNum="1" Name="Abc" />
  <b Age="4" Sex="M" FirstName="John" />
</Data>

しかし、それを達成する方法がわかりません。

ヒントはありますか?

4

2 に答える 2

4

それを行う「簡単な」方法はありません。FOR XML PATH|EXPLICIT|AUTOすべてのトップレベルの出力要素が同じ名前を持つ必要があります。また、複数のクエリを一緒に UNION することはできませんFOR XML(Sql Server 2012)。

あなたが進んだ方向は、最も信頼性が高く柔軟です。基本的に、含める要素の種類ごとに個別の列を追加する必要があります。これに対する最後の試みを単純化して、必要なものを取得できます。

SELECT
    (
        SELECT 1 AS [@OrdNum], 'Abc' AS [@Name]
            WHERE 1=1
            FOR XML PATH ('a'), TYPE
    )
    , 
    (
        SELECT 4 AS [@Age], 'M' AS [@Sex], 'John' AS [@FirstName]
            WHERE 1=1
            FOR XML PATH ('b'), TYPE
    )
    FOR XML PATH ('Data'), TYPE;

上記のクエリの出力:

<Data>
  <a OrdNum="1" Name="Abc" />
  <b Age="4" Sex="M" FirstName="John" />
</Data>

を使用する場合FOR XML PATH、列のエイリアスは XPath です。したがって、それを属性名にするには、「@」を前に付ける必要があります---エイリアスをエスケープする必要があります(したがって、[])。パラメータ onPATHは、各行の Xml 要素の名前を指定します。このTYPEオプションは、出力を nvarchar(max) ではなく Xml 型として保持することを示しています。これは、外側のクエリがそれをより適切にマージできることを意味します。そして、外側のクエリには、それが表す単一の要素に詰め込むための 2 つの列しかありません。最後に、私は が好きですがWHERE 1=1、構文的には必須ではありません。

接線:あなたの例が単純化されていることは知っているので、Xmlデータ型に「メソッド」を適用できることを知りたいと思うかもしれません。たとえば、上記が必要であるが、外側のクエリには "b" 要素しか必要なかったとします。メソッドを使用してquery()、Xml の一部のみを選択し、外部クエリにマージできます。

SELECT 
    (
        SELECT
            (
                SELECT 1 AS [@OrdNum], 'Abc' AS [@Name]
                    WHERE 1=1
                    FOR XML PATH('a'), TYPE
            )
            , 
            (
                SELECT 4 AS [@Age], 'M' AS [@Sex], 'John' AS [@FirstName]
                    WHERE 1=1
                    FOR XML PATH('b'), TYPE
            )
            FOR XML PATH('Data'), TYPE
    ).query('Data/b');

これが生成されます:

<b Age="4" Sex="M" FirstName="John" />
于 2016-01-09T17:14:07.397 に答える
1

SQL Server 2005 で導入された FOR XML PATH オプションを確認する必要があります。詳細については、Microsoft SQL Server 2005 の FOR XML の新機能に関するドキュメントを参照してください。

基本的に、FOR XML PATH を使用すると、XML の形状を非常に簡単に定義できます。特定の構造を定義したり、特定の列を属性として出力したり、他の列を要素として定義したりできます。完全に制御できます。

ここでフォーマットする方法の詳細を取得できます。

ここにリンクの説明を入力

于 2014-05-21T16:50:56.563 に答える