Изменить таблицу, затем обновить в одном выражении

У меня есть требование, когда мне нужно изменить (Добавить 2 столбца), а затем обновить ту же таблицу.

Вот запрос, который я пробовал:

ALTER TABLE A
ADD c1 int,c2 varchar(10)

UPDATE  A set c1 = 23, c2 = 'ZZXX'

Мне нужно запустить эти два запроса одновременно.

Я использую инструмент Talend ETL, у нас есть компонент tMssqlrow, который позволяет нам запускать несколько запросов (я использую от 10 до 15 запросов обновлений в одном компоненте).

Но указанный выше запрос не работает.

Я тестировал в базе данных Microsoft SQL. Я получаю следующую ошибку:

Msg 207, уровень 16, состояние 1, строка 5

Недопустимое имя столбца 'c1'. Msg 207,

Уровень 16, состояние 1, строка 5

Недопустимое имя столбца 'c2'.

может кто-нибудь помочь мне решить эту проблему.

Ответы

Ответ 1

Вы не можете сделать это точно в одном заявлении (или пакете), и, похоже, инструмент, который вы используете, не поддерживает GO как разделитель пакетов.

Вы можете использовать EXEC, чтобы запустить его в дочерней группе.

ALTER TABLE A
  ADD c1 INT, c2 VARCHAR(10);

EXEC('
UPDATE A
SET    c1 = 23,
       c2 = ''ZZXX'';
    ');

Примечание. Все одиночные кавычки в запросе необходимо удвоить, как указано выше, чтобы избежать их внутри строкового литерала.

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

ALTER TABLE A
  ADD c1 INT NULL CONSTRAINT DF_A_c1 DEFAULT 23 WITH VALUES, 
     c2 VARCHAR(10) CONSTRAINT DF_A_c2 NULL DEFAULT 'ZZXX' WITH VALUES;

Но это не совсем то же самое, что и исходный запрос, поскольку ограничения по умолчанию будут оставлены позади и могут быть отброшены.

Ответ 2

Используйте GO между двумя запросами.

Ответ 3

Попробуйте это

ALTER TABLE A ADD c1 int,c2 varchar(10)

GO

UPDATE  A set c1 = 23, c2 = 'ZZXX'

GO