为什么CREATE VIEW必须是批处理中的第一个语句?

时间:2013-08-27 12:43:07

标签: sql sql-server

CREATE VIEW必须首先在批处理中声明是否有任何逻辑原因?这种设计背后的理由是什么?

1 个答案:

答案 0 :(得分:14)

并不是它必须是批处理中的第一个语句,而是它必须是批处理中的 only 语句。出于同样的原因,CREATE PROCEDURECREATE 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 语句在批次中