gpt4 book ai didi

sql-server - SQL Server : when using multiple UPDATES in a single query, WHERE 子句将使用当前或更新的字段值吗?

转载 作者:行者123 更新时间:2023-12-02 21:38:55 25 4
gpt4 key购买 nike

这是一个非常简单的问题,但 SQL Server 文档并没有像我希望的那样清楚地解释这一点,因此我希望有人能帮我拼写出来。

我正在根据电子表格使用新值更新表格 - 这意味着我正在使用多个 UPDATE单个查询中的语句:

UPDATE Asset SET AssetID = 'NewID' WHERE AssetID = 'OldID'

这是基本查询,但用实际 ID 号代替 NewID 和 OldID,因此整个查询看起来很像这样;

UPDATE Asset SET AssetID = '001' WHERE AssetID = '111'
UPDATE Asset SET AssetID = '002' WHERE AssetID = '112'
UPDATE Asset SET AssetID = '003' WHERE AssetID = '113'

我担心遇到的问题是,在某些情况下,根据 SQL 更新这些字段的顺序以及它在 WHERE 中使用的值,可能会出现这种情况。子句,我可能最终会无意中更新多行。

例如:

UPDATE Asset SET AssetID = '001' WHERE AssetID = '111'
UPDATE Asset SET AssetID = '002' WHERE AssetID = '001'
UPDATE Asset SET AssetID = '003' WHERE AssetID = '002'

现在想象一下,在运行上述查询之前,我有下表:

AssetID
111
001
002

我想要发生的是WHERE我的 UPDATE 中的条款语句,仅使用 AssetID CURRENTLY 列 - 即 ID在运行查询之前使用。

这会给我下表:

AssetID
001
002
003

我担心实际上会发生的是,它会按顺序处理更新,并使用更新的 IDWHERE子句,这意味着我的表格将如下所示:

AssetID
003
003
003

现在,在我对此进行研究的过程中,我设法找到了一些有关 SQL Server 如何处理此问题的文档 - 即它使用 UPDATED 值。它指出此行为与“普通 SQL”处理它的方式不同,因此我希望在使用 SQL Server 时这不会成为问题。

有人可以确认吗?

最佳答案

这是 Halloween problem 的体现.
由于更新的应用方式(尤其是唯一性),您还可能会遇到约束错误

一次性进行多次更新以避免中间错误的方法是进行一次更新

UPDATE
A
SET
A.AssetID = N.NewAssetID
FROM
Asset A
JOIN
SomeTempTableOrTableVar N ON A.AssetID = OldAssetId

SomeTempTableOrTableVar 是具有 2 列的值子句的表值参数、临时表或表变量

编辑:或者根据OP的评论使用额外的列。

示例

UPDATE Asset SET AssetID = '001' WHERE AssetID = '111'
UPDATE Asset SET AssetID = '002' WHERE AssetID = '001'
UPDATE Asset SET AssetID = '003' WHERE AssetID = '002'

...变成这样:

UPDATE
A
SET
A.AssetID = N.NewAssetID
FROM
Asset A
JOIN
(VALUES
('111', '001'),
('001', '002'),
('002', '003')
) N (OldAssetId, NewAssetID) ON A.AssetID = OldAssetId

关于sql-server - SQL Server : when using multiple UPDATES in a single query, WHERE 子句将使用当前或更新的字段值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16589656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com