带连接表的SQL更新记录

时间:2017-11-11 02:50:16

标签: sql sql-server tsql join

目前我需要从表A到表B移动三列。我使用更新连接表脚本将现有数据复制到新列。之后,表A中的旧列将会丢弃。

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 Script一次以上,以确保数据库是最新的。

虽然我If (Columns Exist) Begin (Alter Add, Update, Alter Drop) End确保了所需列的存在。但是当脚本下次运行时,它会出现错误,指出在“更新”查询中未找到旧表中的列。因为在第一次运行脚本时删除了列。

还有其他方法可以解决吗?

2 个答案:

答案 0 :(得分: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');

如果结果记录为空,则表示表中不存在指定的列,因此您可以跳过查询。

答案 1 :(得分: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;