UPDATE TableA
SET Value = a.Value * b.AnotherValue
FROM TableA AS a
INNER JOIN TableB AS b
WHERE (Condition is true);
这是问题所在。 TableA的Value字段不允许空值。如果计算a.Value * b.AnotherValue产生null,则抛出错误。现在的问题。当计算结果为空并且删除记录而不是更新它时,有没有办法告诉UPDATE忽略SET阶段。此UPDATE旨在一次更新数百条记录,但如果遇到单个null,则会失败。另请注意,使用ISNULL()函数并将值设置为零是不可接受的。如果遇到null,我希望删除记录。非常感谢您提供任何帮助。
答案 0 :(得分:3)
假设你的意思是在遇到空值时保持值不变“如果遇到null,我希望删除记录。”
UPDATE TableA
SET Value = isnull(a.Value * b.AnotherValue, a.value)
FROM TableA AS a
INNER JOIN TableB AS b
WHERE (Condition is true);
如果您确实要删除行并使用SQL 2008或更高版本,请尝试使用merge语句。
MERGE TableA AS target
USING TableB as source ON (target.ID = Source.ID)
WHEN MATCHED AND TableB.AnotherValue Is Null THEN DELETE
WHEN MATCHED THEN UPDATE SET target.Value = Target.Value * Source.AnotherValue;
答案 1 :(得分:0)
您无法在更新期间删除行,您需要两个语句:删除后跟更新。
答案 2 :(得分:0)
这可以在两个陈述中完成:
UPDATE TableA
SET Value = a.Value * b.AnotherValue
FROM TableA AS a
INNER JOIN TableB AS b
WHERE (Condition is true) and (a.Value * b.AnotherValue) is not null;
Delete a FROM TableA AS a
INNER JOIN TableB AS b
WHERE (Condition is true) and (a.Value * b.AnotherValue) is null;
这是最简单的解决方案。
如果情况没有完全解决,你可以开始做更复杂的事情(交易,临时表,MERGE
等)。