2012-02-21 12 views
0

データの移行中です。私は2つのテーブルには、私は何をする必要があることはmaster_tableからIddetail_table.master_table_idを記入し、old_master_table_idOldIdを削除している入れ子になったsqlの実行を制限する方法

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 
.... 

以下のように外部キーでリンクされています。私は、次の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 

私があれば持っており、それが正常に動作しますが、コマンドの上に私にエラーを与える無効な列名は「old_master_table_id」。

上記のエラーを回避するにはどうすればよいですか?

+1

問題は、SQLは、 'if'を実行する前に、現在のデータベーススキーマに基づいてバッチ全体をコンパイルすることです。 –

答えて

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 
関連する問題