Как вы ссылаетесь на новые столбцы сразу после их создания в вашем скрипте SQL - PullRequest
2 голосов
/ 10 декабря 2011

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

Это общая форма моего SQL:

BEGIN TRANSACTION

  if (not exists(select 1 from THIS_TABLE))
      BEGIN
        ALTER TABLE THIS_TABLE add THIS_COLUMN int
      END
COMMIT

BEGIN TRANSACTION

    IF (NOT EXISTS (SELECT 1 FROM THIS_TABLE
            WHERE THIS_COLUMN = 1))
    BEGIN
            UPDATE THIS_TABLE SET THIS_COLUMN = 1 
    END

COMMIT

Это ошибка, которую я получаю:

Invalid column name 'THIS_COLUMN'. 

в этой строке:

        IF (NOT EXISTS (SELECT 1 FROM THIS_TABLE
            WHERE THIS_COLUMN = 1))

Ответы [ 2 ]

7 голосов
/ 10 декабря 2011

Столбец должен быть создан перед тем, как запрос, который его использует, может быть проанализирован. Вы можете сделать это, поместив update в другой пакет, используя ключевое слово "go":

alter table t1 add c1 int
go
update t1 set c1 = 1

Или запустив вторую транзакцию как динамический SQL:

alter table t1 add c1 int
exec ('update t1 set c1 = 1')
1 голос
/ 11 декабря 2011

Что сказал Андомар правильно, вам нужно использовать ключевое слово go.Однако большая проблема в том, что ваша логика выглядит неправильно.Позвольте мне рассмотреть каждый случай использования:

Если THIS_TABLE не пусто

Если таблица не пуста, if ниже возвращает false ивы никогда не добавите новый столбец.

  if (not exists(select 1 from THIS_TABLE))
          BEGIN
            ALTER TABLE THIS_TABLE add THIS_COLUMN int
          END

Тогда следующий сценарий, очевидно, завершится ошибкой, поскольку такого столбца нет THIS_COLUMN:

IF (NOT EXISTS (SELECT 1 FROM THIS_TABLE
            WHERE THIS_COLUMN = 1))

Если THIS_TABLE пусто

Если таблица пуста, добавляется столбец:

  if (not exists(select 1 from THIS_TABLE))
          BEGIN
            ALTER TABLE THIS_TABLE add THIS_COLUMN int
          END

Но тогда следующий if всегда будет истинным, а оператор обновления будет влиять на нольстроки (потому что таблица пуста).

IF (NOT EXISTS (SELECT 1 FROM THIS_TABLE
            WHERE THIS_COLUMN = 1))
BEGIN
        UPDATE THIS_TABLE SET THIS_COLUMN = 1 
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...