Изменить таблицу, затем обновить в одном выражении
У меня есть требование, когда мне нужно изменить (Добавить 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