Как ограничить выполнение вложенных sql, если - PullRequest
0 голосов
/ 21 февраля 2012

Я в процессе миграции данных. У меня есть две таблицы, связанные с внешним ключом, как показано ниже

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. Я использую следующую команду обновления, а затем удаляю столбец. эта команда отлично работает в первый раз. однако мне нужно ограничить выполнение команд, чтобы они выполнялись только при наличии старых столбцов.

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 Ответ

2 голосов
/ 21 февраля 2012

Вы можете попробовать динамический 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...