CREATE VIEW必须首先在批处理中声明是否有任何逻辑原因?这种设计背后的理由是什么?
Aar*_*and 14
它不是必须是批处理中的第一个语句,而是它必须是批处理中的唯一语句.出于同样的原因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中任何模块的脚本 - 包括视图,过程,函数和触发器 - 必须是批处理中的唯一语句.