'GO' 可以在 SQL 中过度使用吗?

Can 'GO' be overused in SQL?

我是 SQL 的新手,想知道 GO 是否可以过度使用。 GO 是否会以任何方式影响性能或产生任何其他意想不到的后果?

不,它不能被过度使用,也没有必要。 GO 语句不是 Transact-SQL 命令,而是多个 MS 实用程序可识别的分隔符,包括 SQL Server Management Studio 代码编辑器。

GO 分隔符用于将 SQL 命令分组,并一起发送到服务器。批处理中包含的命令,即自上次 GO 命令或会话开始以来的命令集,必须在逻辑上保持一致。例如,您不能在一个批次中定义一个变量,然后在另一个批次中使用它,因为变量的范围仅限于定义它的批次。

有关详细信息,请参阅 http://msdn.microsoft.com/en-us/library/ms188037.aspx

我想任何东西都可能被过度使用,但 go 似乎很难。 Go 只是简单地执行它前面的 t-sql ,如果你按 F5 键,不管怎样你都打算执行它。它可能会导致一些额外的工作,例如重新声明变量等等,但它基本上是无害的。

我能想到的最好的比喻是 go 就像一个逗号;这个,然后那个。过度使用逗号会使阅读你所写的内容变得混乱,过度使用 go 也会造成同样的后果。

如前所述,GO 不是语句,而是用于将脚本分成批次。每个批次都会发送到服务器并由服务器执行。

因此,是的,可能会过度使用它。如果您有多个逻辑上属于同一批的语句,并且没有技术原因将它们放在不同的批中,那么是的,如果您无论如何都将它们分开,那么您就过度使用了它。

一个简单的例子是 CREATE TABLE 后跟新创建的 table 的 INSERT INTO。如果它们在同一个批次中,并且 CREATE TABLE 失败,则整个批次将中止,服务器甚至不会尝试插入不存在的 table。如果你用 GO 将它们分开,你不仅会得到关于错误 CREATE TABLE 的错误,你还会从 INSERT INTO 得到错误,而 table 没有'存在。或者更糟的是,该名称可能会解析为 不同 table(名称相同,架构不同),而不是您尝试插入的名称。

但也有这样的情况,语句在逻辑上属于同一个批次,但不被 SQL 服务器接受为一个批次。 IIRC,CREATE VIEW 是一个必须是批处理中第一个也是唯一一个语句的语句示例。如果你打算创建一个视图A,和一个引用A的视图B,你仍然不能把它们放在同一个批次中,你需要在GO之间他们或一些其他形式的强制单独的批次。那样的话,GO绝对没有被过度使用。