CREATE VIEW必须首先在批处理中声明是否有任何逻辑原因?这种设计背后的理由是什么?
答案 0 :(得分:14)
并不是它必须是批处理中的第一个语句,而是它必须是批处理中的 only 语句。出于同样的原因,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中任何模块的脚本 - 包括视图,过程,函数和触发器 - 必须是 only 语句在批次中。