2017-11-11 173 views
0

目前我需要將表A中的三列移動到表B,並且我使用更新連接表腳本將現有數據複製到新列。之後,表A中的舊列將被刪除。帶連接表的SQL更新記錄

Alter table NewB add columnA integer 
Alter table NewB add columnB integer 

Update NewB 
Set NewB.columnA = OldA.columnA, NewB.columnB = OldA.columnB 
From NewB 
Join OldA on NewB.ID = OldA.ID 

Alter table OldA drop column columnA 
Alter table OldA drop column columnB 

這些腳本將添加新列,並將舊錶中的現有數據更新爲新創建的列。然後刪除舊的列。

但由於系統結構的原因,我需要運行SQL腳本多次,以確保數據庫是最新的。

雖然我做了If (Columns Exist) Begin (Alter Add, Update, Alter Drop) End以確保所需列的存在。但是當腳本在下次運行時,它會出現錯誤,表示在「更新」查詢中沒有從舊錶中找到列。因爲第一次運行腳本時列已被刪除。

還有其他方法可以解決嗎?

回答

0

,你將不能夠使用連接到更新,但你可以這樣做:

Update NewB set NewB.columnA = (select OldA.columnA from OldA where NewB.ID = OldA.ID);

Update NewB set NewB.columnB = (select OldA.columnB from OldA where NewB.ID = OldA.ID);

我不知道你正在使用的數據庫,數據庫中有一些系統表,從哪裏可以得到列是否存在於表中或者不存在,就像在oracle中一樣,All_TAB_COLUMNS包含表中所有列的信息,所以你可以像下面這樣打表:

select 1 from ALL_TAB_COLUMNS where TABLE_NAME='OldA' and COLUMN_NAME in ('columnA','columnB');

如果結果記錄爲空,這意味着表中不存在指定的列,所以您可以跳過查詢。

0

您的is column exists支票一定有問題。我有很多次類似的DDL和DML操作。因爲你沒有說明你是如何檢查專欄存在的,所以我無法告訴你什麼是錯的。

無論如何,您正在向表中添加一個新列。我們可以檢查這個列是否存在,如果不存在 - 運行腳本,如果是 - 跳過腳本。這裏是檢查:

IF EXISTS(SELECT 1 FROM [sys].[columns] WHERE OBJECT_ID('[dbo].[NewB]') = [object_id] AND [name] = 'columnA') 
BEGIN 
    BEGIN TRANSACTION; 

    .... 

    COMMIT TRANSACTION; 
END;