You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 09:32:49