在SQL Server中,何时应该使用GO以及何时应该使用分号;?

时间:2010-09-13 14:03:19

标签: sql sql-server

我总是对在命令后使用GO关键字以及命令末尾是否需要使用分号感到困惑。有什么区别以及为什么/何时应该使用它们?

当我在SQL Server Management Studio中运行Generate-script时,它似乎在整个地方都使用了GO,而不是分号。

5 个答案:

答案 0 :(得分:88)

GO仅与SSMS相关 - 它不是实际的Transact SQL,它只是告诉SSMS按顺序在每个批次中的每个GO之间发送SQL语句。

;是一个SQL语句分隔符,但在大多数情况下,引擎可以解释语句的分解位置。

主要的例外情况以及最常使用;的位置是在公用表表达式声明之前。

答案 1 :(得分:73)

您在Generated DDL脚本中看到如此多GO的原因是由于以下rule批量生成。

  

创建默认,创建功能,   创建程序,创建规则,创建   TRIGGER和CREATE VIEW语句   不能与其他人合并   批量陈述。创造   声明必须开始批处理。所有   随后的其他陈述   批次将被解释为   第一个CREATE的定义   言。

Generated DDL的一个用例是在单个文件中生成多个对象。因此,DDL生成器必须能够生成批次。正如其他人所说,GO声明结束了批次。

答案 2 :(得分:32)

GO

Go是一个批处理分隔符。这意味着该批次中的所有内容都是该特定批次的本地内容。

变量,表变量等的任何声明都不会发送GO语句。

#Temp表是连接的本地表,因此它们跨越GO语句。

分号

分号是一个语句终止符。这纯粹用于识别特定语句已结束。

在大多数情况下,语句语法本身足以确定语句的结束。

但是,CTE要求WITH是第一个语句,因此在WITH之前需要一个分号。

答案 3 :(得分:10)

您应该使用分号来终止每个SQL语句。这在SQL标准中定义,

当然,SQL Server通常允许您省略语句终止符,但为什么会陷入不良习惯?

正如其他人所指出的,公共表表达式(CTE)之前的语句必须以分号结束。因此,对于尚未完全接受半结肠终结者的人,我们看到了这一点:

;WITH ...

我认为看起来很奇怪。我想在一个在线论坛上,当你无法分辨它将被粘贴的代码质量时,这是有意义的。

此外,MERGE语句必须以分号结束。你在这看到一个模式吗?这些是TSQL的一些新增功能,它们严格遵循SQL标准。看起来SQL Server团队正在努力使用分号终止符。

答案 4 :(得分:6)

GO是批量终止符,分号是语句终止符。

当你想在一个脚本中有多个create proc语句时,你将使用GO,因为create proc必须是批处理中的第一个语句。如果使用公用表表达式,那么之前的语句需要以分号结尾