查询在sql服务器中只改变最后一条记录的值。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查询在sql服务器中只改变最后一条记录的值。相关的知识,希望对你有一定的参考价值。
我在sql服务器上有一个带有XML数据类型的表。我想改变其中一个属性的值。该表看起来像。
id--------version-------XMLdata
1---------2--------------<Package version="1"> .... </Package>
2---------2--------------<Package version="1"> .... </Package>
3---------2--------------<Package version="1"> .... </Package>
and so on
我想把XML数据里面的版本更新为2,比如:
id--------version-------XMLdata
1---------2--------------<Package version="2"> .... </Package>
2---------2--------------<Package version="2"> .... </Package>
3---------2--------------<Package version="2"> .... </Package>
and so on
我运行了一个查询,就像:
UPDATE Tbl
SET XMLDATA.modify('replace value of (/Package[1]/@version)[1] with "2"')
WHERE version=2
但在输出中,我只看到最后一条记录的版本被修改为2.单个记录我也能更新,但不是所有记录一起更新。
UPDATE Tbl
SET XMLDATA.modify('replace value of (/Package[1]/@version)[1] with "2"')
WHERE id=1
但不是所有记录一起更新。我不明白这背后的原因是什么,我试着创建了一个名为Tbl2的表的副本,在那里,查询正在更新XML数据中的所有记录版本,可能的依赖关系是什么,它停止了查询以改变版本属性值?
答案
.modify()
是非常有限的,它允许每次调用只做一次更改,但这应该能达到预期的效果。试试这个。
DECLARE @tbl TABLE (id INT,[version] INT, XMLdata XML);
INSERT INTO @tbl VALUES
(1,2,'<Package version="1"> .... </Package>')
,(2,2,'<Package version="1"> .... </Package>')
,(3,2,'<Package version="1"> .... </Package>');
UPDATE @tbl SET XMLdata.modify('replace value of (/Package/@version)[1] with 2')
WHERE [version]=2;
SELECT * FROM @tbl;
你可以用 sql:column("version")
而不是 2
悄无声息 WHERE
在一次调用中设置所有XML版本属性与表的版本列同步。
UPDATE @tbl SET XMLdata.modify('replace value of (/Package/@version)[1] with sql:column("version")');
以上是关于查询在sql服务器中只改变最后一条记录的值。的主要内容,如果未能解决你的问题,请参考以下文章