查询在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")');

给TA打赏
共{{data.count}}人
人已打赏
解决方案

csrf_token包含在表格中。

2022-4-20 8:00:10

解决方案

破坏性转让,但没有模式。

2022-4-20 8:00:12

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索