所以我试着搜索这个问题。但说实话,我甚至不确定什么会导致我的代码第一次工作,但后来用错误替换结果。我可能缺乏一些基本的东西。如果是这种情况,那么我道歉。
这是我的代码
UPDATE tableA
SET tableA.X=
CASE WHEN tableB.A <= 0 AND tableA.X = '' THEN CONVERT(NVARCHAR(10), CONVERT(DATE, GETDATE(), 103), 103)
WHEN TableB.A > 0 THEN ''
ELSE 'Error'
END
FROM tableB JOIN tableA
ON tableB.key=tableA.key;
我想做的事情很简单。当我检测到tableB.A为0的情况时,我想将tableA.X更新为今天的日期。但是当tableB.A再次大于0时,我只想用其他东西替换这个日期。
当前正在发生的是当我第一次运行代码时。它用今天的日期替换tableB.A.但是第二天,它会将所有日期替换为错误。
示例结果: TableB.A = 0 TableA.X = 26/03/2017
明天 TableB.A = 0 TableA.X ='错误
为什么会这样?
感谢您的时间。
答案 0 :(得分:0)
您已使用此条件更新了 tableA.X &#34; tableB.A&lt; = 0 AND tableA.X =&#39;& #39; 到当前日期。
现在 tableA.X 不再是&#39; &#39; (因为它有一个日期),所以它将输入ELSE
子句。
答案 1 :(得分:0)
问题是第一个AND
上的WHEN
条件。在这里,当表B低于或等于0 时,您将放置今天的日期表A的X是空的。
tableB.A <= 0 AND tableA.X = ''
第一次执行后(假设X为空字符串且B为负数),您将使用今天的日期替换X的值。所以明天,对于B的相同表达式和值,条件将不为真(因为X不是空的,它具有今天的值)。因为它不是真的和第二个条件
TableB.A > 0
仍然是假的(假设B的值仍为负数或零),那么它将跳转到ELSE
(错误)。
解决方案是将X的旧值保留在ELSE
。
ELSE tableA.X END
或者,如果您想在每次执行时设置今天的值,请删除第一个WHEN
上的X空比较。
... WHEN tableB.A <= 0 THEN ...
答案 2 :(得分:0)
尝试使用以下脚本
UPDATE a
SET a.X=
CASE WHEN isnull(convert(int,b.A ),0)<= 0 AND isnull(a.X,0) = 0 THEN convert(varchar,getdate(),103)
WHEN b.A > 0 THEN ''
ELSE 'Error' END
FROM b JOIN a
ON b.key=a.key