SQL Server xml 变量不是通过引用

Posted

技术标签:

【中文标题】SQL Server xml 变量不是通过引用【英文标题】:SQL Server xml variable is not by reference 【发布时间】:2021-11-16 01:48:12 【问题描述】:

以下查询应将节点附加到现有 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')
select  @rowsBOK.value('(*/key)[1]','varchar(100)'), @rowsBOK.value('(*/value)[1]','varchar(100)')
set @rowsBOK.modify('insert <added>aaa</added> as first into (*)[1]') 
select cast(@a_bo_key_xml as varchar(max))
select cast(@rowsBOK  as varchar(max))
output:
<r><items><item><key>k1</key><value>v1</value></item></items></r>
<item><added>aaa</added><key>k1</key><value>v1</value></item>
expected:
<r><items><item><added>aaa</added><key>k1</key><value>v1</value></item></items></r>
<item><added>aaa</added><key>k1</key><value>v1</value></item>

【问题讨论】:

【参考方案1】:

XML 变量在重新分配时采用新的标识,两者之间没有联系。

直接修改@a_bo_key_xml变量即可:

declare @a_bo_key_xml xml='<r><items><item><key>k1</key><value>v1</value></item></items></r>';
set @a_bo_key_xml.modify('insert <added>aaa</added> as first into (/r/items/item)[1]');
select @a_bo_key_xml;

db<>fiddle

【讨论】:

谢谢,我一直怀疑使用整个 xml 效率较低 不,它不是这样工作的。在内部,它由可以有效查找的 ID 表示。复制肯定更慢

以上是关于SQL Server xml 变量不是通过引用的主要内容,如果未能解决你的问题,请参考以下文章