在SQL Server中,什么时候应该使用GO,何时使用分号;

我一直对于在命令后面使用GO关键字以及在命令结尾是否需要分号的问题感到困惑。 有什么区别,为什么/何时使用它们?

当我在SQL Server Management Studio中运行生成脚本时,似乎使用GO遍历,而不是分号。

GO只涉及到SSMS–它不是实际的Transact SQL,它只是告诉SSMS按顺序在每个GO之间发送SQL语句。

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

主要的例外,以及所在的地方; 最常用的是在Common Table Expression Statement之前。

您在生成的DDL脚本中看到如此多的GO的原因是由于以下关于批次的规则 。

CREATE DEFAULT,CREATE FUNCTION,CREATE PROCEDURE,CREATE RULE,CREATE TRIGGER和CREATE VIEW语句不能与批处理中的其他语句结合使用。 CREATE语句必须开始批处理。 在该批处理中的所有其他语句将被解释为第一个CREATE语句定义的一部分。

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

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

variables,表variables等的任何声明都不会经过GO语句。

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

分号

分号是语句的终结者。 这纯粹用于确定一个特定的陈述已经结束。

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

然而,CTE的要求WITH是第一个语句,所以你需要在WITH之前使用分号。

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

当然,通常SQL Server允许你省略语句结束符,但是为什么要进入坏习惯呢?

正如其他人所指出的,在共同表格expression式(CTE)之前的陈述必须以分号结尾。 结果,从没有完全接受这个分号结束的人,我们看到这样的结果:

 ;WITH ... 

我认为这看起来很奇怪。 我想这是有道理的,当你不能知道它将被粘贴的代码的质量。

此外, MERGE语句必须以分号结尾。 你在这里看到一个模式? 这些是TSQL的一些新增function,它们严格遵循SQL标准。 看起来像SQL Server团队正在强制使用分号结束符的道路。

GO是一个批处理终结符,一个分号是一个语句终结符。

当你想在1个脚本中有多个create proc语句时,你将使用GO,因为create proc必须是批处理中的第一个语句。 如果您使用公用表expression式,则需要使用分号终止语句