使用#temp表中的字段的存储过程问题

时间:2018-07-09 17:21:06

标签: sql sql-server

我有一个基本上执行此操作的存储过程:

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中使用它?知道为什么吗?

4 个答案:

答案 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

您仅设置了field1field2的值,因此其他值均为空。您需要了解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