SQL Server не может добавить, удалить, добавить столбец?

#sql-server-2016

#sql-server-2016

Вопрос:

Когда я запускаю это в одном пакете:

 ALTER TABLE SomeTable ADD FOO int NULL;

alter table SomeTable drop column foo

ALTER TABLE SomeTable ADD FOO int NULL;

select top 1 FOO from SomeTable
  

… почему в SQL Management Studio конечным результатом является то, что столбец FOO не существует в таблице SomeTable?

Оператор select выдает ошибку, но ни один из предыдущих операторов не выдает ошибку.

Добавление операторов GO устранило бы проблему, но почему в одном пакете он действует так, как действует?

Ответ №1:

«почему в SQL Management Studio конечным результатом является то, что столбец FOO не существует в таблице SomeTable?»Это не так. Проблема в том, что вы пытаетесь сослаться на столбец в том же пакете, который вы выполнили ALTER в таблице, в которую вы его добавили; это приводит к ошибке синтаксического анализа, и весь пакет не запускается.

Либо разделить SELECT на отдельный пакет (использовать GO в SSMS), либо отложить синтаксический анализ SELECT :

 EXEC sys.sp_executesql N'SELECT TOP 1 FOO FROM dbo.SomeTable ORDER BY SomeColumn;';
  

Комментарии:

1. Я знаю, что оператор GO исправит это. Я могу добавить столбец и индекс в один пакет без ошибок. Проблема в том, что я выбираю из недавно добавленного столбца в том же пакете? Что я могу / не могу сделать в том же пакете для вновь созданного столбца?

2. По причине, которую я указываю в ответе, @DeveloperWebs: «это приводит к ошибке синтаксического анализа, и весь пакет не запускается»..

3. Верно, но я могу создать новый столбец и добавить к нему индекс в том же пакете. Что еще я могу сделать в одном пакете для вновь созданного столбца? Как насчет индексов, если я создам один, он автоматически повлияет на тот же пакет?

4. Потому что так настроен синтаксический анализатор, @DeveloperWebs ; это был бы вопрос к разработчику самого SQL Server и, вероятно, предшествовал ему (и восходит к SyBase). Боюсь, это не меняет ответа. Отложите проверку инструкции или используйте пакеты.

5. Я понимаю, что анализатор настроен таким образом. вы упускаете мою мысль. Всегда ли мне нужно идти после добавления столбца? Какие другие инструкции я могу использовать, которые влияют на вновь созданный столбец в том же пакете без получения ошибки синтаксического анализа (добавление индексов к новому столбцу в том же пакете, похоже, не дает ошибки)? разумно ли использовать GO каждый раз, когда вы добавляете новый столбец и хотите использовать этот новый столбец в любом заявлении?