SQL Server中如何按PONo条件删除XML变量内的指定子节点
问题原因及解决方法
错误点梳理
- 根节点名称拼写错误:你的XML根节点是
NewData,原代码写为NewDataSet,路径完全不匹配 - 谓词位置错误:筛选
PONo值的谓词应作用于XML节点,而非要删除的BatchNo/ExpiryDate节点,这两个子节点下不存在PONo子节点,永远无法匹配到符合条件的节点 - 语法格式错误:XQuery表达式的引号闭合位置错误,且
sql:variable()内的变量名需要用引号包裹 - 额外注意:你给出的XML示例中
<PONo>的闭合标签误写为</SAPPONo>,属于XML格式错误,需先修正为</PONo>否则XML本身无法正常解析
正确实现代码
-- 方法1:分两次删除对应节点 SET @XML.modify('delete /NewData/XML[PONo = sql:variable("@result")]/BatchNo') SET @XML.modify('delete /NewData/XML[PONo = sql:variable("@result")]/ExpiryDate') -- 方法2:单次调用同时删除两个节点,执行效率更高 SET @XML.modify(' delete /NewData/XML[PONo = sql:variable("@result")]/(BatchNo, ExpiryDate) ')
执行后可通过SELECT @XML验证修改结果,符合条件的XML节点下的BatchNo和ExpiryDate节点会被删除。
内容的提问来源于stack exchange,提问作者Levesque Xylia
相关产品推荐
相关产品推荐

