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 回答