给定以下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)
答案 0 :(得分:3)
你快到了。
您需要使用nodes()
将xml粉碎到您要使用的行中 - 在这里,您需要每个section
元素的结果集行,因此请将其粉碎与
nodes('/data/section')
完成后,您只需要使xpath [1]
在语法上正确(并且相对于您将在'{1}}中的section
节点:
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