如何在T-SQL的XQuery query()方法中保留祖先/兄弟节点结构?
需求实现方案
原问题说明
现有如下XML数据及T-SQL查询语句:
DECLARE @xml XML = N' <members> <member> <name>John</name> <age>32</age> </member> <member> <name>ELisa</name> <age>28</age> </member> <member> <name>Alex</name> <age>26</age> </member> </members>'; SELECT @xml.query('/members/member/age[text() > 26 ]');
当前查询仅返回符合年龄条件的<age>节点:
<age>32</age> <age>28</age>
需要实现两种输出:
- 包含对应完整
<member>节点的<members>结构 - 仅包含
<name>节点的<member>结构
实现方法
1. 返回包含完整<member>节点的<members>结构
通过XQuery路径筛选符合条件的<member>节点,重新包装到<members>根节点中即可实现:
DECLARE @xml XML = N' <members> <member> <name>John</name> <age>32</age> </member> <member> <name>ELisa</name> <age>28</age> </member> <member> <name>Alex</name> <age>26</age> </member> </members>'; SELECT @xml.query(' <members> {/members/member[age/text() > 26]} </members> ');
执行后输出结果:
<members> <member> <name>John</name> <age>32</age> </member> <member> <name>ELisa</name> <age>28</age> </member> </members>
2. 返回仅包含<name>节点的<member>结构
使用XQuery循环遍历符合条件的<member>节点,为每个节点构造仅包含<name>的新节点:
DECLARE @xml XML = N' <members> <member> <name>John</name> <age>32</age> </member> <member> <name>ELisa</name> <age>28</age> </member> <member> <name>Alex</name> <age>26</age> </member> </members>'; -- 带<members>根节点的版本 SELECT @xml.query(' <members> { for $m in /members/member[age/text() > 26] return <member> {$m/name} </member> } </members> ');
执行后输出结果:
<members> <member> <name>John</name> </member> <member> <name>ELisa</name> </member> </members>
如果不需要<members>根节点,可简化查询:
SELECT @xml.query(' for $m in /members/member[age/text() > 26] return <member> {$m/name} </member> ');
输出结果:
<member> <name>John</name> </member> <member> <name>ELisa</name> </member>
以上两种需求均可以通过T-SQL结合XQuery完全实现。
内容的提问来源于stack exchange,提问作者Miles Fan
相关产品推荐
相关产品推荐

