使用游标更新表,但也更新另一个表中的记录

时间:2010-03-17 23:37:50

标签: plsql cursor

我正在使用新ID更新ID,但我需要为表A中的主记录及其表B中的依赖项保留相同的ID。

评论中包含的大块是我无法弄清楚的部分。我需要更新表B中与我正在查看表A的当前记录共享相同ID的所有记录。

DECLARE CURSOR_A CURSOR FOR 
SELECT * FROM TABLE_A
FOR UPDATE

OPEN CURSOR_A
FETCH NEXT FROM CURSOR_A

WHILE @@FETCH_STATUS = 0
BEGIN

BEGIN TRANSACTION
    UPDATE KEYMASTERTABLE
    SET RUNNING_NUMBER=RUNNING_NUMBER+1
    WHERE TRANSACTION_TYPE='TABLE_A_NEXT_ID'

-- FOLLOWING CHUNK IS WRONG!!!
    UPDATE TABLE_B
    SET TABLE_B_ID=(SELECT RUNNING_NUMBER
    FROM KEYMASTERTABLE WHERE TRANSACTION_TYPE='TABLE_A_NEXT_ID')
    WHERE TABLE_B_ID = (SELECT TABLE_A_ID 
    FROM CURRENT OF CURSOR A)
-- END OF BAD CHUNK

    UPDATE TABLE_A
    SET TABLE_A_ID=(SELECT RUNNING_NUMBER 
    FROM KEYMASTERTABLE WHERE TRANSACTION_TYPE='TABLE_A_NEXT_ID') 
    WHERE CURRENT OF CURSOR_A
COMMIT
    FETCH NEXT FROM CURSOR_A
END

CLOSE CURSOR_A
DEALLOCATE CURSOR_A
GO

1 个答案:

答案 0 :(得分:0)

假设这个将当前数据递增+1的过程不会导致数据本身出现问题,我会创建一个转换表。 Column1将是旧ID,Column2将是新ID。 这两个表都将通过相同的更新运行。 如果出现问题,这也可以让您对流程进行审核。

这样的东西
Update table TargetA a 
   set a.id =(select t.column2 from tranlation_table t where t.column1 = a.id);

Update table TargetB b 
   set b.id =(select t.column2 from tranlation_table t where t.column1 = b.id)