Есть ли логическая причина, по которой CREATE VIEW должен быть первым оператором в пакете? Что является обоснованием такого дизайна?Почему CREATE VIEW должен быть первым заявлением в пакете?
ответ
Это не так много, что она должна быть первым заявления в партии, а то, что он должен быть только заявления в пакете. По этой же причине CREATE PROCEDURE
, CREATE FUNCTION
и т. Д. Все должны быть в их собственной партии ... их нужно скомпилировать независимо от другого кода. Одна из причин заключается в том, чтобы что-либо в пакете, созданное до, объект фактически существует, когда он создан, и все, что относится к объекту , затем имеет то, что нужно указать. Другой, чтобы помочь предотвратить этот материал:
-- some other code here
CREATE PROCEDURE dbo.whatever
AS
-- procedure code here
-- some other code here
Мы не хотим «какой-то другой код здесь» должны быть включены в определение хранимой процедуры. Мы также не знаем, что делать с этим:
CREATE PROCEDURE dbo.proc1
AS
-- some code here
-- a comment here
CREATE PROCEDURE dbo.proc2
AS
Поскольку мы можем законно размещать комментарии перед темCREATE PROCEDURE
, как делает анализатор знать, какой объект комментарий принадлежит?
И для придирчивого, то же самое относится и к представлениям. (Обратите внимание, что процедура использовалась в примере просто потому, что процедура может содержать несколько операторов, а представление не может, а процедура с несколькими операторами гораздо более распространена, чем представление с несколькими комментариями.) Но мы можем продемонстрировать один и тот же тип проблемы - спросите себя, не разделите ли вы два вида на свои собственные партии, откуда вы знаете, какое представление должно принадлежать comment4
?
-- comment1
CREATE VIEW dbo.view1
AS
-- comment2
SELECT
-- comment3
* from sys.objects
-- comment4
CREATE VIEW dbo.view2
AS
-- comment5
SELECT
-- comment6
* from sys.objects
В Management Studio, вы работаете вокруг этого, помещая GO
между объектными скриптами. Обратите внимание, что GO
не является T-SQL, это специализированный разделитель пакетов; с других интерфейсов вам придется передавать свои партии по-разному другими способами.
Опять же, ответ в первом предложении: скрипт для создания или изменить любой модуль в SQL Server - в том числе представления, процедуры, функции и триггеры - должны быть только заявление в пакете.
Тема: «CREATE VIEW» должен быть первым оператором в пакете, почему вы говорите о хранимых процедурах вместо представлений? –
@ Серхио, потому что все модули в SQL Server соответствуют тем же правилам - СОЗДАТЬ ВИД, СОЗДАТЬ ПРОЦЕДУРУ, СОЗДАТЬ ТРИГГЕР, СОЗДАТЬ ФУНКЦИЮ - все они должны быть единственным утверждением в пакете. Может быть, вы могли бы объяснить мне, почему мой ответ, на который я ответил в первом предложении, стоит проголосовать просто потому, что я добавил дополнительный пример, который использовал ПРОЦЕДУРА вместо VIEW? Вы хотите, чтобы я изменил их для просмотра, даже если они не меняют * фактический ответ *? Причина, по которой пример демонстрирует проблему, заключается в том, что процедура может иметь более одного оператора, но представление не может. –
Извините, сначала мне показалось, что это отступление в вопросе, отличном от того, что допрашивалось. Если все модули в SQL следуют тем же правилам, я полагаю, что то, что вы объясняете для PROCEDURES, также применимо к Views. –
- 1. 'CREATE VIEW' должен быть первым оператором в пакете запроса
- 2. ALTER VIEW должен быть единственным заявлением в пакете
- 3. «CREATE/ALTER PROCEDURE» должен быть первым оператором в пакете запроса
- 4. CREATE VIEW должен быть единственным заявлением в партии
- 5. «Create VIEW» должен быть единственным оператором в пакете
- 6. SQL Server: dymanic ошибка SQL: «CREATE VIEW» должен быть первым оператором в пакете запроса
- 7. динамическая ошибка sql: «CREATE TRIGGER» должен быть первым оператором в пакете запросов
- 8. неправильный синтаксис CREATE PROCEDURE должен быть единственным оператором в пакете»
- 9. незарегистрированное Исключение/это() должно быть первым заявлением
- 10. CSS: @import: почему он должен быть первым?
- 11. некорректной ошибки синтаксиса CREATE VIEW должен быть единственным оператором в пакете
- 12. Groovy: CREATE VIEW из скрипта терпит неудачу с 'создать вид должен быть первым'
- 13. Какой модификатор должен быть первым?
- 14. Почему stdfax.h должен быть первым, включенным в приложения MFC?
- 15. Почему вызов «this» должен быть первым выражением в конструкторе?
- 16. Почему QObject должен быть первым в случае множественного наследования
- 17. sql error: «CREATE/ALTER PROCEDURE» должно быть первым оператором в пакете запросов?
- 18. «CREATE FUNCTION» должно быть первым оператором в пакете запросов. Entity Framework Code First
- 19. «CREATE FUNCTION» должно быть единственным заявлением в партии
- 20. CREATE VIEW с проверкой существования
- 21. Открыть DataReader, который должен быть закрыт первым
- 22. Второй вызов webservice должен быть прерван первым
- 23. C# SetCompatibleTextRenderingDefault должен быть вызван перед первым
- 24. Почему ошибка синтаксиса в MySQL CREATE VIEW?
- 25. Должен ли вызов метода суперкласса быть первым утверждением?
- 26. вызов super() должен быть первым выражением в корпусе конструктора
- 27. Конструктор вызов должен быть первым оператором в конструкторе с наследованием
- 28. SQL CREATE VIEW Ошибка
- 29. Ошибка: Super должен быть первым выражением в конструкторе
- 30. Postgresql create view
Если мы говорим о TSQL, вам, вероятно, не будет 'GO' до/после' CREATE VIEW'. SQL строит запросы на основе разделителей, поэтому их исключение делает SQL неуверенным в том, что является частью представления и что является другим выражением. –