2013-08-27 2 views
4

Есть ли логическая причина, по которой CREATE VIEW должен быть первым оператором в пакете? Что является обоснованием такого дизайна?Почему CREATE VIEW должен быть первым заявлением в пакете?

+0

Если мы говорим о TSQL, вам, вероятно, не будет 'GO' до/после' CREATE VIEW'. SQL строит запросы на основе разделителей, поэтому их исключение делает SQL неуверенным в том, что является частью представления и что является другим выражением. –

ответ

13

Это не так много, что она должна быть первым заявления в партии, а то, что он должен быть только заявления в пакете. По этой же причине 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 - в том числе представления, процедуры, функции и триггеры - должны быть только заявление в пакете.

+0

Тема: «CREATE VIEW» должен быть первым оператором в пакете, почему вы говорите о хранимых процедурах вместо представлений? –

+0

@ Серхио, потому что все модули в SQL Server соответствуют тем же правилам - СОЗДАТЬ ВИД, СОЗДАТЬ ПРОЦЕДУРУ, СОЗДАТЬ ТРИГГЕР, СОЗДАТЬ ФУНКЦИЮ - все они должны быть единственным утверждением в пакете. Может быть, вы могли бы объяснить мне, почему мой ответ, на который я ответил в первом предложении, стоит проголосовать просто потому, что я добавил дополнительный пример, который использовал ПРОЦЕДУРА вместо VIEW? Вы хотите, чтобы я изменил их для просмотра, даже если они не меняют * фактический ответ *? Причина, по которой пример демонстрирует проблему, заключается в том, что процедура может иметь более одного оператора, но представление не может. –

+0

Извините, сначала мне показалось, что это отступление в вопросе, отличном от того, что допрашивалось. Если все модули в SQL следуют тем же правилам, я полагаю, что то, что вы объясняете для PROCEDURES, также применимо к Views. –

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