Null和UPDATE语句的问题

时间:2010-05-27 22:45:32

标签: sql tsql

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,我希望删除记录。非常感谢您提供任何帮助。

3 个答案:

答案 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等)。