#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 каждый раз, когда вы добавляете новый столбец и хотите использовать этот новый столбец в любом заявлении?