目前我需要从表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
确保了所需列的存在。但是当脚本下次运行时,它会出现错误,指出在“更新”查询中未找到旧表中的列。因为在第一次运行脚本时删除了列。
还有其他方法可以解决吗?
答案 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;