Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 基于另一列更新列';s值,该值也正在更新_Sql Server - Fatal编程技术网

Sql server 基于另一列更新列';s值,该值也正在更新

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之前,那么您的查询应该很好,因为顺序确实很重要。它也有可能像

我想用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 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将处理任何此类意外行为。