Как разобрать XML с другими полями в несколько строк в SQL? - PullRequest
2 голосов
/ 17 апреля 2019

У меня есть таблица с полями данных. Одно из полей имеет тип XML. В хранимых XML-файлах есть по крайней мере один узел с подэлементами, которые мне нужно извлечь.

Пример строки таблицы:

Id  UserId  Date        XML
1   1001    2019-02-13  *

* XML =

<root>
    <action>
        <type>1</type>
        <res>0</res>
    </action>
    <action>
        <type>1</type>
        <res>10</res>
    </action>
    <action>
        <type>2</type>
        <res>-5</res>
    </action>
</root>

Я знаю, как получить отдельные значения с помощью XML.value и как анализировать все узлы в отдельной таблице. Я просто не могу понять, как объединить эти два результата в нужный мне результат.

Ожидаемый результат:

Id  UserId  Date        Type    Res
1   1001    2019-02-13  1        0
1   1001    2019-02-13  1       10
1   1001    2019-02-13  2       -5

1 Ответ

0 голосов
/ 18 апреля 2019

CROSS APPLY на nodes() ваш друг:

DECLARE @t TABLE(Id INT, UserId INT, [Date] DATETIME, [XML] XML);
INSERT @t VALUES (1, 1001, '2019-02-13', N'
<root>
    <action>
        <type>1</type>
        <res>0</res>
    </action>
    <action>
        <type>1</type>
        <res>10</res>
    </action>
    <action>
        <type>2</type>
        <res>-5</res>
    </action>
</root>');

SELECT 
    Id, 
    UserId, 
    [Date], 
    [Type] = [action].value('type[1]', 'int'),
    [Res] = [action].value('res[1]', 'int')
FROM @t 
CROSS APPLY [XML].nodes('/root/action') actions([action]);

Результат:

+----+--------+-------------------------+------+-----+
| Id | UserId |          Date           | Type | Res |
+----+--------+-------------------------+------+-----+
|  1 |   1001 | 2019-02-13 00:00:00.000 |    1 |   0 |
|  1 |   1001 | 2019-02-13 00:00:00.000 |    1 |  10 |
|  1 |   1001 | 2019-02-13 00:00:00.000 |    2 |  -5 |
+----+--------+-------------------------+------+-----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...