我有一个基本上执行此操作的存储过程:
self.registerField("projectName", comboBox, "currentText")
这很好用,这非常简化。
现在我正在做的是更新Total,Total2和Total3的值,如下所示:
Create table #temp(
field1 int,
field2 int,
total int,
total2 int,
total3 int
)
insert into #temp
(
field1,
field2,
)
Select x.field1, y.field2 from tblA x left join tblB y on x.clientid = y.clientid
所以在上面的update语句中,如果我使用已经插入到表中的字段,他们可以让我进行更新,但是,由于我更新了表中的total2,因此无法在total3中使用它?知道为什么吗?
答案 0 :(得分:3)
运行更新时,总计列为NULL
。
因此total3
正在这样做:NULL * 100.0
填充total3
后,您可以分别更新total2
:
update #temp
set total = field1 + field2,
total2 = field1 + field2 + 300
update #temp
set total3 = total2 * 100.0
或者您可以将total2
替换为填充它的逻辑:
update #temp
set total = field1 + field2,
total2 = field1 + field2 + 300,
total3 = (field1 + field2 + 300) * 100.0
答案 1 :(得分:3)
这是您的update
:
update #temp
set Total = field1 + field2 <-- works
total2 = field1 + field2 + 300 <-- works
total3 = total2 * 100.0 <-- no value
您仅设置了field1
和field2
的值,因此其他值均为空。您需要了解set
子句不是按顺序“一次全部”执行的。 =
左侧的列引用是“新”记录;右边的列引用是“旧”记录。因此,您可以通过重复表达式来解决问题。
解决问题的另一种方法是使用子查询,CTE或apply
:
update #temp
set Total = v.new_total,
total2 = v2.new_total2 <-- works
total3 = v2.total2 * 100.0 <-- no value
from #temp t cross apply
(values (field1 + field2) ) v(new_total),
(values (new_total + 300) ) v2(new_total2)
答案 2 :(得分:2)
可以尝试以下操作:
update #temp set Total = field1 + field2
total2 = field1 + field2 + 300
total3 = (field1 + field2 + 300) * 100.0
答案 3 :(得分:1)
您遇到的问题是因为在尝试访问它的同时设置了total2变量。为了使更新正常进行,您必须使用与更新total2相同的逻辑来更新total3,或者必须为total3创建单独的更新。
这就是我要做的:
update #temp set Total = field1 + field2 <-- works
total2 = field1 + field2 + 300 <-- works
total3 = (field1 + field2 + 300) * 100.0 <-- should get value
请注意,我将total2的加法逻辑放在用于计算total3的括号中。这是因为total2变量在语句完成执行之前不保留任何值。
另一种方法是将更新分为两个独立的语句,例如:
update #temp set Total = field1 + field2 <-- works
total2 = field1 + field2 + 300 <-- works
然后
update #temp set total3 = (field1 + field2 + 300) * 100.0