如何通过if限制嵌套sql的执行

时间:2012-02-21 03:07:18

标签: sql sql-server sql-server-2008

我正在迁移数据。我有两个与外键链接的表,如下所示

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_idOldId。我正在使用以下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'无效。

如何避免上述错误?

1 个答案:

答案 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