我有一个带有数据字段的表。字段之一是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
答案 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 |
+----+--------+-------------------------+------+-----+