我总是对在命令后使用GO关键字以及命令末尾是否需要使用分号感到困惑。有什么区别以及为什么/何时应该使用它们?
当我在SQL Server Management Studio中运行Generate-script时,它似乎在整个地方都使用了GO,而不是分号。
答案 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
语句。
#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必须是批处理中的第一个语句。如果使用公用表表达式,那么之前的语句需要以分号结尾