我正在迁移数据。我有两个与外键链接的表,如下所示
master_table
------------
OldId char -- Old Primary key
Id int -- New Primary Key
....
detail_table
------------
Id int
old_master_table_id char -- old FK from master_table
master_table_id int -- new FK from master_table
....
我需要做的是使用detail_table.master_table_id
中的Id
填充master_table
并删除old_master_table_id
和OldId
。我正在使用以下Update命令然后删除列。这个命令第一次正常工作。但是我需要限制命令的执行,所以它只在旧列存在时运行。
IF NOT Exists(SELECT * FROM sys.columns WHERE
Object_ID = Object_ID('detail_table') AND Name = 'old_master_table_id') BEGIN
UPDATE detail_table SET
master_table_id = (SELECT Id FROM master_table
WHERE
detail_table.old_master_table_id=master_table.OldId);
ALTER TABLE detail_table DROP COLUMN old_master_table_id;
END
虽然我有if并且它工作正常,但上面的命令给我错误列名'old_master_table_id'无效。
如何避免上述错误?
答案 0 :(得分:2)
您可以尝试动态SQL。只有适用时,您才会编译有问题的查询。
IF NOT Exists(SELECT * FROM sys.columns WHERE
Object_ID = Object_ID('detail_table') AND Name = 'old_master_table_id') BEGIN
EXEC sp_executesql "UPDATE detail_table SET " +
" master_table_id = (SELECT Id FROM master_table " +
" WHERE " +
" detail_table.old_master_table_id=master_table.OldId); " +
" ALTER TABLE detail_table DROP COLUMN old_master_table_id; "
END