SQL Server中按条件修改XML字段内指定Flag节点值的问题
问题原因
原有代码的modify方法内的XPath表达式没有限定仅匹配Token值为"C"的CustomSettingValue节点,只会修改整段XML中第一个值为false的Flag节点(也就是Token为B的对应节点),因此看不到Token=C节点的Flag变化。
修正后的完整代码
DECLARE @tbl TABLE(testXML XML) INSERT INTO @tbl (testXML) VALUES ('<CustomSettingValues xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ABC.ABC.Interfaces/PInterfaceSettings.xsd"> <CustomSettingValue> <Token>A</Token> <Display>true</Display> <Flag>true</Flag> <Required>false</Required> <SettingValue>0</SettingValue> </CustomSettingValue> <CustomSettingValue> <Token>B</Token> <Display>true</Display> <Flag>false</Flag> <Required>false</Required> </CustomSettingValue> <CustomSettingValue> <Token>C</Token> <Display>true</Display> <Flag>false</Flag> <Required>false</Required> </CustomSettingValue> <CustomSettingValue> <Token>D</Token> <Display>true</Display> <Flag>false</Flag> <Required>true</Required> </CustomSettingValue> </CustomSettingValues>') ;WITH XMLNAMESPACES(DEFAULT 'http://ABC.ABC.Interfaces/PInterfaceSettings.xsd') UPDATE @tbl SET testXML.modify('replace value of (/CustomSettingValues/CustomSettingValue[Token/text()="C"]/Flag/text()[.="false"])[1] with "true"') WHERE testXML.exist('/CustomSettingValues/CustomSettingValue/Token/text()[.="C"]')=1; SELECT * FROM @tbl
关键修改说明
- 在XPath路径的
CustomSettingValue节点后添加了筛选条件[Token/text()="C"],精准定位到Token值为"C"的配置节点,再修改其下的Flag值 - 原有WHERE条件可以过滤掉不存在Token="C"配置的行,避免无意义的更新操作,性能更优
内容的提问来源于stack exchange,提问作者Fylix
相关产品推荐
相关产品推荐

