Как написать xquery в SQL Server для чтения всех дочерних узлов из столбца данных XML в таблице? - PullRequest
0 голосов
/ 21 июля 2011

У меня есть таблица на сервере SQL с именем [QueryResult] со столбцами типа Init, типа XML.

Вот пример XML данных столбца Result.

<OUTPUT>
<item>
    <VALUE001>2023038.09</VALUE001>
    <VALUE002>265127.97</VALUE002>
    <VALUE003>459868.86</VALUE003>
    <VALUE004>16000.01</VALUE004>
    <VALUE005>552010.15</VALUE005>
    <VALUE006>21404.96</VALUE006>
<item>
<item>
    <VALUE001>15655501.89</VALUE001>
    <VALUE002>17172.50</VALUE002>
    <VALUE003>8345.31</VALUE003>
    <VALUE004>-117264374.12</VALUE004>
    <VALUE005>-160893.48</VALUE005>
</item>
</OUTPUT>

Мне нужен запрос, который возвращает вывод следующим образом:

id      Element          Value
-----------------------------------
1   VALUE001     2023038.09
2   VALUE001    2023038.09
3   VALUE002    265127.97
4   VALUE003    459868.86
5   VALUE004    16000.01
6   VALUE005    552010.15 
7   VALUE006    21404.96
8   VALUE001    15655501.89
9   VALUE002    17172.50
10  VALUE003    8345.31
11  VALUE004    -117264374.12
12  VALUE005    -160893.48

Дайте мне знать, если вопрос вам не понятен?

1 Ответ

1 голос
/ 22 июля 2011

Вот одно из решений:

DECLARE @xml XML = 
'
<OUTPUT>
<item>
    <VALUE001>2023038.09</VALUE001>
    <VALUE002>265127.97</VALUE002>
    <VALUE003>459868.86</VALUE003>
    <VALUE004>16000.01</VALUE004>
    <VALUE005>552010.15</VALUE005>
    <VALUE006>21404.96</VALUE006>
</item>
<item>
    <VALUE001>15655501.89</VALUE001>
    <VALUE002>17172.50</VALUE002>
    <VALUE003>8345.31</VALUE003>
    <VALUE004>-117264374.12</VALUE004>
    <VALUE005>-160893.48</VALUE005>
</item>
</OUTPUT>
'

SELECT  T.c.value('local-name(.)[1]', 'varchar(100)') AS Element,
        T.c.value('./text()[1]', 'decimal(17,2)') AS Value
FROM   @xml.nodes('//item/child::node()') T(c);

Возвратить порядковый номер узла сложнее, чем кажется. Этот вопрос предлагает одно решение, но я его здесь не реализовал, так как это что-то вроде хака.

...