CREATE VIEW必须是批处理中的第一条语句有什么逻辑原因吗?这种设计背后的理论基础是什么?
发布于 2013-08-27 20:51: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中的任何模块(包括视图、过程、函数和触发器)的脚本必须是batch中的 only 语句。
https://stackoverflow.com/questions/18465777
复制相似问题