代码之家  ›  专栏  ›  技术社区  ›  Koosh

使用临时表中的字段时出现存储过程问题

  •  1
  • Koosh  · 技术社区  · 7 年前

    我有一个基本上可以做到这一点的存储过程:

    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
    

    这工作很好,这是非常简单。

    现在我要做的是更新total、total2和total3的值,如下所示:

    update #temp set Total = field1 + field2  <-- works
                     total2 = field1 + field2 + 300 <-- works
                     total3 = total2 * 100.0    <-- no value
    

    所以在上面的update语句中,如果我使用已经插入到表中的字段,他们允许我更新它,但是,由于我更新了表中的total2,所以不能使用total3?知道为什么吗?

    4 回复  |  直到 7 年前
        1
  •  3
  •   Aaron Dietz    7 年前

    总计列是 NULL 在运行更新时。

    所以 total3 正在执行以下操作: NULL * 100.0

    你可以更新 总计3 单独地,一旦你 total2 :

    update #temp 
    set total = field1 + field2,
        total2 = field1 + field2 + 300
    
    update #temp 
    set total3 = total2 * 100.0 
    

    或者你可以替换 总计2 用填充它的逻辑:

    update #temp 
    set total = field1 + field2,
        total2 = field1 + field2 + 300,
        total3 = (field1 + field2 + 300) * 100.0
    
        2
  •  3
  •   Gordon Linoff    7 年前

    这是你的 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)
    
        3
  •  2
  •   Ankur Patel    7 年前

    可以尝试以下操作:

    update #temp set Total = field1 + field2
                     total2 = field1 + field2 + 300
                     total3 = (field1 + field2 + 300) * 100.0
    
        4
  •  1
  •   Adam Murray    7 年前

    您遇到的问题是,在试图访问total2变量的同时设置了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的paranthesis中。这是因为total2变量在语句完成执行之前不持有任何值。

    另一种方法是将更新拆分为两个单独的语句,例如:

     update #temp set Total = field1 + field2  <-- works
                         total2 = field1 + field2 + 300 <-- works
    

    然后

     update #temp set total3 = (field1 + field2 + 300) * 100.0