现有一表数据如下:
ID   A      B     C
1    1000   0    1000
2    100    0    1100
3    0      500  600
4    300    0    900
5    0      1000 1900
......
现要求修改任意一行C列的值就把ID>这一行ID的所有C列的值用上一行的C列值+当前行A列值-当前行B列值替换当前行的C列值.SQLSERVER2000数据库,任何SQL语句都行但要注意速度,数据可能上万行

解决方案 »

  1.   

    先把需要更新的数据行放在数组中,ID号对应i值
      

  2.   

    Create Proc UPDATE_C_Column
    (
    @ID int,
    @C_Val int
    )DECLARE @int_ID int
    DECLARE @int_C int--更新当前记录
    UPDATE TABLE1
    SET C = @C_Val
    Where ID = @IDSELECT top 1 @int_ID =ID , @int_C = @C_Val + A - B 
    FROM TABLE1
    WHERE ID > @ID
    ORDER BY ID
      
    --递归调用
    IF @@ROWCOUNT <>0 
      BEGIN 
           EXEC UPDATE_C_Column(@int_ID, @int_C)
      END
      

  3.   

    if modify=true then   '如果表C列有改动,保存该行数
                   i=rows.index          
                   var=c(i)           'var保存修改前的值 
                for j=id(bound0 to i-2 step -1
                    c(j)=c(j-1)+a(j)-b(j)
                    next j
                    j=j-1
                    c(j)=var+a(j)-b(j)
                     end
      

  4.   


    Create Proc UPDATE_C_Column
    (
    @ID int,
    @C_Val int
    )
    AS
    DECLARE @int_ID intDECLARE @int_C int--更新当前记录
    UPDATE TABLE1
    SET C = @C_Val
    Where [ID] = @IDSELECT top 1 @int_ID =[ID] , @int_C = @C_Val + A - B 
    FROM TABLE1
    WHERE ID > @ID
    ORDER BY [ID]
      
    --递归调用
    IF @@ROWCOUNT <>0 
      BEGIN 
           EXEC UPDATE_C_Column @int_ID, @int_C
      END
      

  5.   

    呵呵,不好意思, 忘了写 AS 了,,刚才只不过在记事本里随便写的,到了“查询分析器”里一看,才知道少了 AS
      

  6.   


    服务器: 消息 217,级别 16,状态 1,过程 UPDATE_C_Column,行 24
    超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32)。
    晕~~~~~~~~~~~~~~~~~~~~~~~~!!!!!!!!!!!!!!!!!!!!!111
      

  7.   

    ALTER  Proc UPDATE_C_Column
    (
    @ID int,
    @C_Val int
    )
    AS
    DECLARE @CUR_ID int
    DECLARE @A int
    DECLARE @B int
    DECLARE @C intDECLARE my_cursor CURSOR FOR 
    SELECT [id], a,b,c
    FROM TABLE1
    WHERE [ID] > @ID
    ORDER BY [id]--更新当前记录
    UPDATE TABLE1
    SET C = @C_Val
    Where [ID] = @ID
    --------------------------------------------------------
    OPEN MY_cursorFETCH NEXT FROM MY_cursor 
    INTO @CUR_ID, @A, @B,@CSET @C = @C_ValWHILE @@FETCH_STATUS = 0
    BEGIN
      UPDATE TABLE1
          SET C= @C + @A - @B
          Where [id]=@cur_id
          ------------------
     SELECT @C_VAL = C FROM TABLE1 WHERE [ID] = @CUR_ID     FETCH NEXT FROM MY_cursor 
     INTO @CUR_ID, @A, @B, @C     SET @C = @C_VAL
         
    ENDCLOSE MY_cursorDEALLOCATE MY_cursor
      

  8.   

    楼上的,在SQL中循环对性能影响大不大啊?
      

  9.   


    ALTER TRIGGER UPDATE_TABLE1
    ON  table1
    FOR  UPDATE 
    AS DECLARE @ID int
    DECLARE @CUR_ID int
    DECLARE @C intBEGIN
    SELECT @C = C , @CUR_ID = [ID] FROM INSERTED
    ----------------------
    SELECT top 1 @ID =[ID] 
    FROM TABLE1
    WHERE ID > @CUR_ID
        ORDER BY [ID]
    ----------------------
        UPDATE TABLE1
    SET C = @C + A - B 
    Where [ID] = @ID
    ENDEXEC  sp_dboption 'master','recursive triggers','true'UPDATE TABLE1
    SET C=99999
    WHERE ID=1EXEC  sp_dboption 'master','recursive triggers','false'
    服务器: 消息 217,级别 16,状态 1,过程 UPDATE_TABLE1,行 19
    超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32)。
    大哥,这种办法也不行,,,呵呵,看来,你只能使用我给你写的存储过程了触发器也不行呀,,呵呵,,只能在存储过程中使用循环了。
      

  10.   

    赶紧结贴吧flyingZFX已经着急了
      

  11.   

    不好意思啊,这两天上网不太方便.....
    我只想问一句在sql中使用循环对性能影响怎么样
    事实上我也用存储过程写了一个,但不知道会不会产生超时.所以发贴询问一下!
      

  12.   

    我终于找到一个不用循环的方法了!!!!答案如下:
    由于改的只是C列
    而当前行C列又是上行C列+当前行A列-当前行B列
    所以当前行的C列就应该是ID小于当前行的sum(A)-sum(B)update table set table.C=(select (sum(A)-sum(B))C from table b where b.ID<a.ID )
      

  13.   

    flyingZFX不就晚点结贴嘛,再说你的方法也不是很好啊
      

  14.   

    update table set table.C=(select (sum(A)-sum(B))C from table b where b.ID<a.ID )呵呵.............
      

  15.   

    flyingZFX 你笑什么?
    我知道我这里掉了几个条件,但思路绝对是正确的!
      

  16.   

    楼主,题目上说“上一行A列值、上一行B列值”
    你用sum(A)、sum(B)“飞呀飞”是不是在笑这个?
      

  17.   

    但上一行的上一行A列值也是由前面的A列和B列得出的啊!各