You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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=&quot;friday&quot;]) with &quot;11:00:00&quot;')
WHERE id = 1

错误原因

  1. 目标节点指向错误:原语句的XPath选中的是整个arrivalSla元素节点,而非需要修改的time属性节点,replace value of无法直接将整个元素替换为属性值。
  2. 未确保目标为单个节点:SQL Server要求replace value of的操作目标必须是单个节点,即使当前数据仅存在一个匹配节点,也需要明确限定避免返回节点集合。

正确的UPDATE语句

修正后的语句需将XPath指向time属性,并确保仅选中单个节点:

UPDATE learnTheXML
SET xmlColumn.modify('replace value of (/feed/schedule/arrivalSla[@dayOfWeek=&quot;friday&quot;]/@time)[1] with &quot;11:00:00&quot;')
WHERE id = 1

修改说明

  • 新增/@time:将操作目标从arrivalSla元素节点改为该节点的time属性节点
  • 新增[1]:强制限定仅选中第一个匹配的节点,符合SQL Server对replace value of的单节点要求

内容的提问来源于stack exchange,提问作者Scott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 05:39:52