Sql server 基于另一列更新列';s值,该值也正在更新
我想用null更新列A。我还希望用null更新B列,但前提是它的值与A列的原始值匹配Sql server 基于另一列更新列';s值,该值也正在更新,sql-server,Sql Server,我想用null更新列A。我还希望用null更新B列,但前提是它的值与A列的原始值匹配 Update MyTable Set A=Null, B=Case When B=A Then Null Else B End 上述声明有效吗?Case语句中的值在求值时是否已为空?更新的顺序重要吗 有没有办法写得更好,避免在不需要的时候设置B=B?我需要在1个语句中执行此操作,因为实际查询很长且复杂,涉及许多联接和子查询。如果您只将B放在A之前,那么您的查询应该很好,因为顺序确实很重要。它也有可能像
Update MyTable
Set A=Null,
B=Case When B=A Then Null Else B End
上述声明有效吗?Case语句中的值在求值时是否已为空?更新的顺序重要吗
有没有办法写得更好,避免在不需要的时候设置B=B?我需要在1个语句中执行此操作,因为实际查询很长且复杂,涉及许多联接和子查询。如果您只将B放在A之前,那么您的查询应该很好,因为顺序确实很重要。它也有可能像你写的那样工作,但我对此表示怀疑
UPDATE MyTable
SET B = CASE WHEN A = B then null else B END,
A = NULL
被更新的列的顺序并不重要:事实上,您还将获得A的原始值(即,如果您正在编写触发器,您将从已删除的虚拟表中获得的值),尽管您在更新期间为其分配了值 您可以使用此脚本轻松测试这一点,该脚本包含两个更新,更新列的顺序不同:
CREATE TABLE Test
(
Id INT PRIMARY KEY NOT NULL,
X INT,
Y INT
)
INSERT Test (Id, X, Y)
VALUES (1, 2, 3)
INSERT Test (Id, X, Y)
VALUES (4, 5, 6)
UPDATE Test
SET X = X + 1,
Y = X
WHERE Id = 1
UPDATE Test
SET Y = X,
X = X + 1
WHERE Id = 4
SELECT *
FROM Test
在这里,SELECT将返回以下内容:
Id X Y
1 3 2
4 6 5
如您所见,更新后的Y值始终与原始X值相同,尽管更新顺序不同。在查询中无法避免为
B
赋值,因此除非您想使用动态SQL,否则您必须接受这一点。正如@sagi所提到的,在将A
置零之前,只需分配B
,您的查询应该可以正常工作。我也考虑过这一点。但在实施之前,我需要确定这一点。如果SQL编译器发现它更有效,是否可能更改顺序?如果您先用B编写查询,一切都会很好。你知道你也可以测试它,然后回滚@领航员只要吞下蓝色药丸,一切都会好起来的。DBA将处理任何此类意外行为。