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 变量不是通过引用的主要内容,如果未能解决你的问题,请参考以下文章

请问在SQLserver 中如何指定一个数据库类型的变量?就是说里面引用的表前的数据库前缀可以像变量一样改变

SQL server2008安装失败原因“未将实例引用设置为实例对象”怎样解决啊?

转载 SQL Server中常用全局变量介绍

sql server而不是使用插入的变量和值触发插入语句

通过 PL SQL 读取 XML(存储在 Long 变量中)

SQL Server:在包含连接的where子句中使用LEN或变量