在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式,则需要使用分号终止语句