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

Posted

技术标签:

【中文标题】如何在 SQL 中将带有其他字段的 XML 解析为多行?【英文标题】:How to parse XML with other fields into multiple lines in SQL? 【发布时间】:2019-04-17 08:14:52 【问题描述】:

我有一个包含数据字段的表格。其中一个字段是 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】:

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 |
+----+--------+-------------------------+------+-----+

【讨论】:

以上是关于如何在 SQL 中将带有其他字段的 XML 解析为多行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 2005 中插入值数组?

如何在 JavaScript node.js 中将 xml 文件解析为数组

如何在视图中将 ntext 字段显示为长字符串?

带有 XML 数据库字段的 Linq-to-SQL —— 为啥会这样?

如何在网站上的 mysql 中将“字段”显示为表 PHP? [复制]

如何使用 XML 在 SQL 中将列默认值设置为今天的日期