现有一表数据如下:
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语句都行但要注意速度,数据可能上万行
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语句都行但要注意速度,数据可能上万行
(
@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
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
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
服务器: 消息 217,级别 16,状态 1,过程 UPDATE_C_Column,行 24
超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32)。
晕~~~~~~~~~~~~~~~~~~~~~~~~!!!!!!!!!!!!!!!!!!!!!111
(
@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
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)。
大哥,这种办法也不行,,,呵呵,看来,你只能使用我给你写的存储过程了触发器也不行呀,,呵呵,,只能在存储过程中使用循环了。
我只想问一句在sql中使用循环对性能影响怎么样
事实上我也用存储过程写了一个,但不知道会不会产生超时.所以发贴询问一下!
由于改的只是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 )
我知道我这里掉了几个条件,但思路绝对是正确的!
你用sum(A)、sum(B)“飞呀飞”是不是在笑这个?