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

如何使用SQL获取并更新XML列中带指定属性的节点值

问题根因

你写的查询有两个核心问题:

  • XPath路径匹配错误:name="Name"属性属于<property>子节点,而非上层的<foo>节点,原写法/array/foo[@name="Name"]匹配不到任何目标节点
  • 方法用错:value()是XML读取方法,仅能提取节点值,无法实现XML内容修改,更新XML列需要使用modify()方法
可直接运行的实现代码

1. 节点匹配验证(可选)

如果要先确认能正确读到所有目标Name节点,可以先执行查询校验:

SELECT 
    xmlcolumn.query('/array/foo/property[@name="Name"]') AS MatchedNodes
FROM xmltable

2. 批量更新所有匹配节点值

由于SQL Server的XML DML操作单次仅能修改一个匹配节点,对于你示例中单条XML包含多个<foo>节点的场景,需要循环执行更新直到所有目标节点都被替换为1:

-- 循环更新,直到所有name=Name的property节点值都为1
WHILE EXISTS(
    SELECT 1 
    FROM xmltable 
    WHERE xmlcolumn.exist('/array/foo/property[@name="Name"][text() != "1"]') = 1
)
BEGIN
    UPDATE xmltable
    SET xmlcolumn.modify('
        replace value of (/array/foo/property[@name="Name"][text() != "1"]/text())[1]
        with "1"
    ')
    WHERE xmlcolumn.exist('/array/foo/property[@name="Name"][text() != "1"]') = 1
END
执行效果

更新完成后,表中xmlcolumn列的内容会和你预期的完全一致:所有带name="Name"属性的<property>节点值统一为1,Gender、DOB等其他节点的属性和值不会被改动。

说明:以上语法针对SQL Server数据库,如果你使用的是PostgreSQL、MySQL等其他数据库,XML操作函数的语法需要对应调整。

内容的提问来源于stack exchange,提问作者mariocatch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:48:19