如何用modify更新SQL Server XML列?解决节点过多报错问题
修改SQL Server XML列属性值报错解决
问题场景
需要将SQL Server表XML类型列中,dayOfWeek属性为"friday"的arrivalSla节点的time属性值修改为"11:00:00",XML原始内容如下:
<feed> <schedule> <arrivalSla dayOfWeek="monday" addDays="1" time="02:00:00"/> <arrivalSla dayOfWeek="tuesday" addDays="1" time="02:00:00"/> <arrivalSla dayOfWeek="wednesday" addDays="1" time="02:00:00"/> <arrivalSla dayOfWeek="thursday" addDays="1" time="02:00:00"/> <arrivalSla dayOfWeek="friday" addDays="3" time="12:45:00"/> </schedule> <assetCode value="FI" /> </feed>
执行以下UPDATE语句时出现报错:
XQuery [learnTheXML.xnlColumn.modify()]: The target of 'replace' must be at most one node, found 'element(arrivalSla,xdt:untyped) *'
错误的UPDATE语句:
UPDATE learnTheXML SET xmlColumn.modify('replace value of (/feed/schedule/arrivalSla[@dayOfWeek="friday"]) with "11:00:00"') WHERE id = 1
错误原因
- 目标节点指向错误:原语句的XPath选中的是整个
arrivalSla元素节点,而非需要修改的time属性节点,replace value of无法直接将整个元素替换为属性值。 - 未确保目标为单个节点:SQL Server要求
replace value of的操作目标必须是单个节点,即使当前数据仅存在一个匹配节点,也需要明确限定避免返回节点集合。
正确的UPDATE语句
修正后的语句需将XPath指向time属性,并确保仅选中单个节点:
UPDATE learnTheXML SET xmlColumn.modify('replace value of (/feed/schedule/arrivalSla[@dayOfWeek="friday"]/@time)[1] with "11:00:00"') WHERE id = 1
修改说明
- 新增
/@time:将操作目标从arrivalSla元素节点改为该节点的time属性节点 - 新增
[1]:强制限定仅选中第一个匹配的节点,符合SQL Server对replace value of的单节点要求
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

