如何将XML与其他字段解析为SQL中的多行?

时间:2019-04-17 08:14:53

标签: sql sql-server xml

我有一个带有数据字段的表。字段之一是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 :(得分:0)

CROSS APPLY on 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 |
+----+--------+-------------------------+------+-----+