5

CREATE VIEW 必须是批处理中的第一个语句是否有任何逻辑原因?这种设计背后的基本原理是什么?

4

1 回答 1

17

与其说它必须是批处理中的第一个语句,不如说它必须是批处理中的唯一语句。出于同样的原因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

GO在 Management Studio 中,您可以通过在对象脚本之间放置一个来解决此问题。请注意,这GO不是 T-SQL,它是特定于应用程序的批处理分隔符;从其他接口,您将需要以其他方式单独传输批次。

同样,答案在第一句话中:在 SQL Server 中创建或更改任何模块(包括视图、过程、函数和触发器)的脚本必须是批处理中的唯一语句。

于 2013-08-27T12:51:14.247 回答