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

时间:2015-06-30 16:26:12

标签: sql-server tsql ssms

我对SQL很陌生,想知道GO是否可以过度使用。 GO会以任何方式影响效果或产生任何其他意外后果吗?

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

正如已经回答的那样,GO不是一个语句,而是用于将脚本分成批处理。每个批次都被发送到服务器并由服务器执行。

因此,是的,可以过度使用它。如果你有多个逻辑上属于同一批次的语句,并且没有技术上的理由将它们分成不同的批次,那么是的,如果你将它们分开,你就会过度使用它。

一个简单的例子是CREATE TABLE后跟新创建的表INSERT INTO。如果它们在同一批次中,并且CREATE TABLE失败,则整个批处理中止,并且服务器甚至懒得尝试插入到不存在的表中。如果您将它们与GO分开,则不会只收到有关错误CREATE TABLE的错误,您还会从INSERT INTO收到该表不存在的错误。或者更糟糕的是,名称可以解析为不同的表(同名,不同的模式),而不是您尝试插入的名称。

但是也有一些情况,语句逻辑上属于一个批处理,但SQL Server不能在一个批处理中接受这些语句。 IIRC,CREATE VIEW是一个声明的示例,它必须是批处理中的第一个也是唯一的声明。如果您打算创建视图A以及引用B的视图A,您仍然无法将它们放在同一批次中,则需要GO他们或其他形式的强制单独批次。在这种情况下,GO绝对不会被滥用。

答案 2 :(得分:1)

我认为任何东西都可以被滥用,但是看起来似乎很艰难。 Go只是简单地执行它前面的t-sql,如果你还是按F5,你就打算不管它执行它。它可能会导致一些额外的工作,例如重新声明变量和什么不是,但它几乎无害。

我能想到的最好的比喻就是逗号;这个,那个。过度使用逗号可以使您阅读的内容令人困惑,过度使用go也可以这样做。