首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么CREATE VIEW必须是批处理中的第一条语句?

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

Stack Overflow用户
提问于 2013-08-27 20:43:07
回答 1查看 16.5K关注 0票数 5

CREATE VIEW必须是批处理中的第一条语句有什么逻辑原因吗?这种设计背后的理论基础是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-27 20:51:14

这并不是说它必须是批处理中的第一个语句,而是它必须是批处理中的唯一语句。出于同样的原因,CREATE PROCEDURECREATE FUNCTION等都必须在自己的批次中……它们需要独立于其他代码进行编译。一个原因是要确保在创建对象之前创建的批处理中的任何内容在创建时都实际存在,而在创建对象之后引用该对象的任何内容都有指向的内容。另一种是帮助防止这种事情:

代码语言:javascript
运行
复制
-- some other code here

CREATE PROCEDURE dbo.whatever
AS
  -- procedure code here

-- some other code here

我们不希望在存储过程的定义中包含“此处的一些其他代码”。我们也不知道该怎么做:

代码语言:javascript
运行
复制
CREATE PROCEDURE dbo.proc1
AS
  -- some code here
-- a comment here
CREATE PROCEDURE dbo.proc2
AS

既然我们可以合法地将注释放在CREATE PROCEDURE之前,解析器如何知道注释属于哪个对象?

对于挑剔的人来说,同样的事情也适用于视图。(请注意,在示例中使用过程只是因为一个过程可以包含多个语句,而视图不能;而且包含多个语句的过程比包含多个注释的视图要常见得多。)但是我们可以演示相同类型的问题-问问自己,如果不将两个视图分成各自的批处理,如何知道哪个视图应该拥有comment4

代码语言:javascript
运行
复制
-- 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中的任何模块(包括视图、过程、函数和触发器)的脚本必须是batch中的 only 语句。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18465777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档