SQL Server xml变量非引用传递,修改子节点不更新原XML问询
SQL Server XML 变量值传递问题及解决方案
SQL Server 中所有 XML 类型变量的赋值都是值传递(深度拷贝),不存在引用传递的用法。你通过query方法提取子节点赋值给@rowsBOK时,已经生成了和原变量@a_bo_key_xml完全独立的新XML副本,修改副本不会同步到原变量。
实现期望输出的两种方案
方案1:直接修改原XML变量(最优)
不需要额外提取子节点,直接定位原XML中要插入节点的位置执行插入操作即可:
declare @a_bo_key_xml xml='<r><items><item><key>k1</key><value>v1</value></item></items></r>' -- 直接对原XML的item节点执行插入 set @a_bo_key_xml.modify('insert <added>aaa</added> as first into (/r/items/item)[1]') Declare @rowsBOK xml=@a_bo_key_xml.query('/r/items/item') select cast(@a_bo_key_xml as varchar(max)) select cast(@rowsBOK as varchar(max))
执行后输出和你的预期完全一致。
方案2:修改子节点后回写原XML
如果你的业务逻辑必须先提取子节点做一系列操作,再同步回原XML,可以操作完成后替换原XML的对应节点:
declare @a_bo_key_xml xml='<r><items><item><key>k1</key><value>v1</value></item></items></r>' Declare @rowsBOK xml=@a_bo_key_xml.query('/r/items/item') set @rowsBOK.modify('insert <added>aaa</added> as first into (*)[1]') -- 把原XML的item节点替换为修改后的@rowsBOK set @a_bo_key_xml.modify('replace value of (/r/items/item)[1] with sql:variable("@rowsBOK")') select cast(@a_bo_key_xml as varchar(max)) select cast(@rowsBOK as varchar(max))
内容的提问来源于stack exchange,提问作者Shay Lapid
相关产品推荐
相关产品推荐

