如何使用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
相关产品推荐
相关产品推荐

