0

次の XML があるとします (「xfield」という SQL 列フィールド内):

<data>
  <section>
    <item id="A">
      <number>987</number>
    </item>
    <item id="B">
      <number>654</number>
    </item>
    <item id="C">
      <number>321</number>
    </item>
  </section>
  <section>
    <item id="A">
      <number>123</number>
    </item>
    <item id="B">
      <number>456</number>
    </item>
    <item id="C">
      <number>789</number>
    </item>
  </section>
</data>

次のテーブル構造を取得するにはどうすればよいですか (列名として A、B & C を使用):

 A | B | C
987|654|321
123|456|789

SQL XQueryを使用して、これを試しています(当然のことながら、無効です):

SELECT
  data.value('(./section/item[@ID = "A"]/number/[1])', 'int') as A,
  data.value('(./section/item[@ID = "B"]/number/[1])', 'int') as B,
  data.value('(./section/item[@ID = "C"]/number/[1])', 'int') as C
FROM Table CROSS APPLY [xfield].nodes('/data') t(data)
4

1 に答える 1

3

もうすぐそこです。

使用する必要があるnodes()に xml を細断処理す​​る必要があります。ここでは、要素ごとに結果セットの行が必要なため、次のように細断処理します。section

nodes('/data/section')

それが完了したら、xpath を[1]構文的に正しくする必要があります (そして、section'in' するノードに対して相対的に):

data.value('(item[@id = "A"]/number)[1]', 'int') as A,
data.value('(item[@id = "B"]/number)[1]', 'int') as B,
data.value('(item[@id = "C"]/number)[1]', 'int') as C

そして出来上がり:

A           B           C
----------- ----------- -----------
987         654         321
123         456         789
于 2010-07-30T13:34:17.833 に答える