Как использовать таблицу CREATE / DROP внутри IF - PullRequest
2 голосов
/ 24 февраля 2012

Я мигрирую данные из серии старых таблиц данных в новые таблицы.В этом процессе я столкнулся с некоторыми проблемами.

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

Вот то, что я придумал до сих пор:

IF NOT EXISTS(SELECT * FROM sys.objects WHERE Object_ID = Object_ID('Old_Table'))
    GOTO Migrated_Before

  -- Drop OldTable Indexes, PK's and FK's;
  -- CREATE newTable ....;
  -- Add Indexes, PK's, Fk's;
  -- INSERT INTO NewTable(someFields) FROM OldTable.Fields, OtherTable.Fields ...;
  -- DROP OldTable;

Migrated_Before:

Вот проблема, Drop и Create нужно GO для фиксации изменений, прежде чем перейти к следующему этапу, в противном случае следующая команда не будет выполненаОднако размещение GO между GOTO и Label сделает метку неопределенной для GOTO.

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

Решение: здесь я оставляю решение в качестве ссылки для других.Я добавил начальную транзакцию перед каждым оператором, который должен произойти, прежде чем перейти к следующему оператору, например, создать таблицу или удалить FK.а также заменил goto и label на начало конца (мое первое решение)

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

Попробуйте использовать begin transaction, commit вместо go

1 голос
/ 24 февраля 2012

Я могу запустить этот код ниже без всякого "GO"

if object_id('abc') is not null
    drop table abc
create table abc (asdf varchar(10))

if object_id('abc') is not null
    drop table abc
create table abc (asdf varchar(10))

if object_id('abc') is not null
    drop table abc
create table abc (asdf varchar(10))

Кроме того, вы можете просто проверить object_id () на null вместо запроса таблицы sys.objects.

1 голос
/ 24 февраля 2012

Попробуйте поместить команды CREATE, DROP и следующие 3 в отдельную хранимую процедуру и вызвать эту процедуру после GOTO.Этот SP будет содержать требуемый оператор GO.Это может сохранить область действия ярлыка как есть.

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