2013-12-03 3 views
2

Я искал вокруг, но я не могу найти правильный ответ, вероятно, я искать неправильно, потому что я не знаю, что искать :)Пусть SQL ждать, пока предыдущее заявление не будет сделано

Так или иначе. У меня есть TSQL с началом и фиксацией транзакции. В транзакции я добавляю несколько столбцов и также переименовываю некоторые столбцы. Сразу после переименования и добавления оператора столбца я также запускаю некоторые операторы обновления для загрузки данных во вновь созданные столбцы.

Теперь проблема в том, что по какой-то причине обновление дает ошибку, что он не может обновить данный столбец, поскольку он не существует (YET ???).

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

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

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

+0

Я бы не рекомендовал его (или ваш подход к вашей проблеме), но если вы создадите блок динамического SQL и выполните его после утверждения, изменяющего вашу схему, - код будет оцениваться по модифицированной схеме – dav1dsm1th

ответ

5

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

Для иллюстрации того, что следующий код не будет работать:

create table sometable(col1 int) 

go 

alter table sometable add col2 varchar(10) 

insert into sometable(col2) values ('a') 

Но вставив go сделает вставки признать новый столбец

create table sometable(col1 int) 

go 

alter table sometable add col2 varchar(10) 

go 

insert into sometable(col2) values ('a') 

Если вы делаете это в кода, вы можете создать отдельную транзакцию для изменений структуры и переноса данных. Вы можете поместить их в одну транзакцию для целостности данных.

+0

Если вы используете GO statment мои переменные теряются, я также делаю некоторые другие вещи в транзакциях. Также оператор GO работает только в «GO» не является командой T-SQL. Является разделителем пакетов. Инструмент клиента (SSM, sqlcmd, osql и т. Д.) Использует его для эффективного сокращения файла при каждом GO и отправки на сервер индивидуального партии.Таким образом, очевидно, что вы не можете использовать GO внутри IF, и вы не можете ожидать, что переменные будут охватывать область по партиям ». –

+0

К сожалению, да ... Но вы не можете добавить столбец и использовать его сразу ... – Szymon

-1

Вы можете попробовать использовать выбрать для обновления,

http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#i2130052

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

2

Это не имеет никакого отношения к времени ожидания. Запросы выполняются по порядку. Это потому, что все запросы отправляются сразу, и поэтому, когда он пытается проверить ваше обновление, столбец не существует в этот момент времени. Чтобы обойти это, вам нужно отправить обновление в отдельной партии. Следующее ключевое слово должно быть добавлено между альтер и обновление заявления

GO 
Смежные вопросы