拥有批处理分离器有什么意义?
阅读了很多答案并发表了评论后,我的想法就是如此。
真正的问题是“批量生产有什么意义?”
批处理有2个含义,它们有一定的意义,还有一些额外的用法go
可能会有用:
1.批处理中的所有语句都编译成一个执行计划
我不知道这对您有什么影响,作为SQL开发人员。但是有。这意味着在同一批中不能有某些语句。例如,您不能ALTER
在表中添加列,然后再添加select
同一列中的该列-因为在编译执行计划时,该列不存在可供选择。
我认为对于SQL Server是否应该能够在不要求开发人员go
在其脚本中包含语句的情况下自行检测到这一点,存在一个公开的争论。此外,文档说ODBC连接可能永远不会发出go
命令。对于我来说,尚不清楚如果包含刚刚给出的ALTER
/SELECT
示例,则通过ODBC运行的脚本将如何表现。
2.局部声明的变量仅存在于声明它们的批处理范围内
这两点结合起来很烂。我有一个用于创建和更改数据库结构(表,过程等)的脚本,并且我想在脚本的开头声明变量,这些变量将用于总体上控制脚本的行为。一旦我需要包装一个批处理(例如,由于一条ALTER
语句-参见我的观点1),那些“ config”变量就超出范围,无法在脚本中进一步使用。我的解决方法是创建一个表,将config变量持久保存到表中,然后通过我的脚本从该表中读取所有内容,然后将表放到最后(以防其他人面对该表)。
第二个含义实际上可以被利用-如果您的脚本正在做很多工作,而您只想清除所有局部变量,则可以简单地包含一条GO
语句,然后声明新变量(即重新使用相同的名称(如果需要的话)。
3. GO有一个可选参数(名为“ count”),它告诉服务器多次重复执行批处理操作
这种用法似乎是添加到该GO
语句的很好的附加功能。我相信GO
,如第1点所述,的初始或主要功能更多地与单个执行计划的编译有关-否则关键字也可能类似REPEAT 10
-但重复什么?批次。如果不GO
表示批次,则repeat命令只能重复前面的单个语句。因此,这GO
是重复批处理的好方法。
参考
所有这些都来自试图了解GO上的MS文档。许多其他答案-在这里和其他问题上-都是文档的一部分,但我认为文档本身并不能真正解释为什么批处理首先有好处-因此,我对已有评论的内容做出了贡献题。
附录
在写完上面的内容之后,我确实在文档中找到了Microsoft提到的“使用批处理规则”GO
。链接的页面说明执行计划由多个语句组成。它还说,可以将各个语句重新编译为新的执行计划(即,通过SQL Server在自动处理批处理的同时)。因此,例如,向CREATE TABLE
您声明之后,INSERT
该表中可能会有一个。这INSERT
表已事先声明在创建后声明将被重新编译。
这加强了这样的想法,即SQL Server可能会检测ALTER
到在表后面紧接a的情况SELECT
,并且它需要重新编译SELECT
(见上面的第1点),并且如果使用ODBC ,这可能正是这种情况。 (请参见上面的第1点)。
这些新信息都不会改变上面给出的3点。我刚刚给出的链接包含其他内容,并以“规则”结尾,这些规则是:
不能将CREATE DEFAULT,CREATE FUNCTION,CREATE PROCEDURE,CREATE RULE,CREATE SCHEMA,CREATE TRIGGER和CREATE VIEW语句与批处理中的其他语句组合使用。CREATE语句必须启动批处理。该批处理中的所有其他其他语句将被解释为第一个CREATE语句的定义的一部分。
不能更改表,然后不能在同一批中引用新列。
如果EXECUTE语句是批处理中的第一条语句,则不需要EXECUTE关键字。如果EXECUTE语句不是批处理中的第一个语句,则需要EXECUTE关键字。