2016-01-14 6 views
0

Я пытаюсь перенести данные во время обновления базы данных, и я не понимаю, почему сценарий 1 работает, но сценарий 2 бросает исключение:базы данных - Недопустимое имя столбца

Сценарий 1

  • Перенос данных из устаревших Таблица в Нью-Таблица
    • работает, если ObsoleteTable и NewTa BLE как существует
    • Нет ошибок если ObsoleteTable был удален уже

запросов Сценарий 1:

-- NewTable already created 
IF EXISTS(select * from sys.tables where name = 'NewTable') 
AND EXISTS(select * from sys.tables where name = 'ObsoleteTable') 
BEGIN 
    UPDATE newTable 
    SET newTable.Name = obsoleteTable.Name 
    FROM dbo.NewTable newTable 
    INNER JOIN dbo.ObsoleteTable obsoleteTable 
     ON obsoleteTable.Id = newTable.Id 
END 
-- ObsoleteTable will be removed after this step 

Сценарий 2

  • Migrate из употребления Колонка Создать Колонка
    • работ, если ObsoleteColumn и NewColumn как существует
    • дает ошибку !!! если ObsoleteColumn удаляется уже

запросов Сценарий 2:

-- NewColumn has been created 
IF EXISTS(select * from sys.columns where object_id = object_id('MyTable') AND name = 'ObsoleteColumn') 
AND EXISTS(select * from sys.columns where object_id = object_id('MyTable') AND name = 'NewColumn') 
BEGIN 
    UPDATE MyTable 
    SET NewColumn = ObsoleteColumn 
END 
-- Obsolete Column will be removed after this step 

Msg 207, Level 16, State 1, Line 4 Неверное имя столбца 'ObsoleteColumn'.

Оба сценария в основном то же самое право? Только перенос в новую структуру, если устаревшая таблица/столбец существует. В противном случае игнорируйте.

Если я выполняю сценарий один, а ObsoleteTable уже удален. это не подведет. Так почему сценарий 2 терпит неудачу?

+0

второй говорит ' если something1 AND something2', где 'something1' является false, ** никогда не будет true **, если эта таблица отсутствует. Я не вижу проблемы с этим. –

+0

Это связано с использованием EXISTS vs =, которые должным образом вызывают ваше замешательство. –

+0

@JarrodRoberson В обоих сценариях я проверяю, существует ли старая и новая таблица/столбец. Если либо новый, либо устаревший не существует, данные не должны (не могут) мигрироваться. – hwcverwe

ответ

2

Это классическая ошибка, колонка ObsoleteColumn не существует. Что означает, что запрос не будет, даже если если programflow никогда не попадает эту строку

Это также не будет:

CREATE TABLE #xxx(a int) 

IF 1 = 2 
SELECT xyz FROM #xxx 

Чтобы избежать этого, вы можете использовать EXECUTE:

IF 1 = 2 
    EXEC('UPDATE MyTable SET NewColumn = ObsoleteColumn') 
+1

Я понимаю, что это классическая ошибка. Но почему мой способ работы работает только для таблиц, но не для столбцов? – hwcverwe

+0

@hwcverwe, это действительно хороший вопрос. К сожалению, я не знаю ответа –