если столбец не существует, измените таблицу - PullRequest
0 голосов
/ 02 мая 2011

Я использую созданный сценарий SQL (sql 2k5), чтобы добавить столбец в таблицу.

Мне нужно добавить «проверить, если существует», потому что мои клиенты иногда запускают скрипт дважды. (Я не контролирую эту часть, и это происходит снова и снова)

Я нашел способ соединения sysobjects и syscolumns, он работает.

Моя проблема в том, что мне нужно добавить столбец в другую таблицу, где столбец находится не в конце таблицы.

Для этого SQL генерирует этот длинный код ... создайте новую временную таблицу с новым столбцом, заполнив ее из старой таблицы, отбросив старую таблицу и, наконец, переименовав временную таблицу.

Проблема в том, что в этом скрипте много GO-ов наряду с транзакциями ...

Что я могу сделать?

1.) Удалить все GO - s? (не нравится идея)

2.) Добавить мой IF между каждой парой GO? (не нравится идея)

3.) Есть ли другой способ, который имеет смысл, и его было бы не слишком сложно реализовать

На самом деле я не могу думать ни о чем, я могу проверить версию релиза или что-нибудь еще, не только присоединение моих sysobjects и syscolumns, но проблема будет та же.

из-за GO, мой If будет "забыт", когда он достигнет КОНЦА НАЧАЛА ...

Ответы [ 2 ]

7 голосов
/ 02 мая 2011

Я не уверен, что следую всему вашему вопросу, но вы бы проверили наличие столбца следующим образом:

if not exists (select * from information_schema.columns 
               where table_name = '[the tables name]' 
               and column_name = '[column name')
begin
 --alter table here
end

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

Если вы часто обновляете при отправке таких скриптов, я бы создал таблицу версий и просто запросэто в начале сценария.

0 голосов
/ 02 мая 2011

Как они запускают сценарии (так как вы используете инструмент, который поддерживает разделитель пакетов GO) - SQL CMD?

Я хотел бы рассмотреть возможность поместить все это в строку и использовать EXEC.Несколько команд DDL должны быть первой командой в пакете.Кроме того, иногда вы можете столкнуться с проблемами при разборе:

ALTER TABLE Выполнение независимо от результатов оценки состояния

Также вы можете захотеть взглянуть на функции управления SQLCMD http://www.simple -talk.com / SQL / SQL инструменты /-SQLCMD-верстак /

...