如何在 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 解析为多行?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JavaScript node.js 中将 xml 文件解析为数组
带有 XML 数据库字段的 Linq-to-SQL —— 为啥会这样?