Не удалось обновить новый столбец после добавления

Учитывая следующий SQL:

IF EXISTS (SELECT * FROM sys.columns WHERE name = 'NewFieldName' AND object_id = OBJECT_ID('dbo.MyTableName'))
    RETURN

-- Add NewFieldName column to part of the Summer 2012 release cycle.
ALTER TABLE dbo.[MyTableName] ADD
    [NewFieldName] SmallINT NOT NULL
        CONSTRAINT DF_MyTableName_NewFieldName DEFAULT (2)

UPDATE [MyTableName] SET NewFieldName = 1 WHERE [Name] = 'FindMe' --Update one specific value

Выдает следующее сообщение об ошибке:

Msg 207, уровень 16, состояние 1, строка 10 Недопустимое имя столбца 'NewFieldName'.

Я уверен, что я пропустил что-то основное, но пытаюсь поместить "GO" после того, как alter запустил UPDATE каждый раз, и я не хочу этого делать.

Как я могу структурировать этот оператор, чтобы он проверил, существует ли столбец и, если он его не добавляет, а затем задайте значения, указанные в моих инструкциях UPDATE?

Ответы

Ответ 1

Вам понадобится инструкция, ссылающаяся на новый столбец, который будет скомпилирован после добавления нового столбца. Один из способов сделать это - запустить его как дочернюю партию с EXEC.

IF NOT EXISTS (SELECT * 
               FROM   sys.columns 
               WHERE  name = 'NewFieldName' 
                      AND object_id = OBJECT_ID('dbo.MyTableName')) 
BEGIN
  -- Add NewFieldName column to part of the Summer 2012 release cycle. 
  ALTER TABLE dbo.[MyTableName] 
           ADD [NewFieldName] SMALLINT NOT NULL 
           CONSTRAINT DF_MyTableName_NewFieldName DEFAULT (2) 

  EXEC(' UPDATE [MyTableName] SET NewFieldName = 1 WHERE [Name] = ''FindMe''') 
END

Причина, по которой это сработало для вас изначально, по-видимому, объясняется тем, что сама таблица не существовала, когда пакет был скомпилирован, что означает, что все инструкции в нем, ссылающиеся на таблицу, подлежат отсроченной компиляции.