Обновить таблицу с помощью курсора, а также обновить записи в другой таблице - PullRequest
0 голосов
/ 18 марта 2010

Я обновляю идентификаторы новыми идентификаторами, но мне нужно сохранить тот же идентификатор для основной записи в таблице A и ее зависимых элементов в таблице B.

Кусок, заключенный в скобки в комментариях, является частью, которую я не могу понять. Мне нужно обновить все записи в таблице B, которые имеют одинаковый идентификатор с текущей записью, которую я просматриваю для таблицы A.

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 голосов
/ 18 марта 2010

Исходя из предположения, что этот процесс увеличения текущих данных на +1 не вызывает проблем в самих данных, я бы создал таблицу перевода. Column1 будет старый идентификатор, Column2 будет новый идентификатор. Обе таблицы будут проходить через одно и то же обновление. Это также дает вам возможность проверять процесс на случай, если что-то пойдет не так.

Что-то вроде

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)
...