TSQL XML字段如何根据同级其他标签的条件更新指定标签的值
解决方案
你可以直接在XPath路径的user节点后添加谓词过滤条件,筛选出符合email_值要求的节点后再定位对应的fname,实现同级标签条件匹配的需求。
正确更新语句
xml.modify('replace value of (/users/user[email_/text()="katie0@adventure-works.com"]/fname/text())[1] with "Kat"')
语法说明
- 谓词
[email_/text()="katie0@adventure-works.com"]直接作用于user节点,筛选规则为「当前user节点下的子节点email_文本等于指定值」,由于email_和fname是同一个user的同级子节点,刚好匹配你的需求 - 末尾的
[1]是SQL Server XML DML的强制要求:replace value of的修改路径必须返回单个确定性节点,加[1]确保取第一个匹配的节点,避免语法报错
多匹配项处理
如果存在多个符合条件的user节点需要批量更新,可以搭配循环执行:
DECLARE @xml XML = '你的XML内容' WHILE @xml.exist('/users/user[email_/text()="katie0@adventure-works.com" and fname/text()!="Kat"]') = 1 BEGIN SET @xml.modify('replace value of (/users/user[email_/text()="katie0@adventure-works.com"]/fname/text())[1] with "Kat"') END
执行后只会修改email_值为katie0@adventure-works.com的用户的fname字段,其他用户数据不受影响。
内容的提问来源于stack exchange,提问作者codeperson
相关产品推荐
相关产品推荐

