2017-11-11 129 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;