在SQLServer中,什么时候应该使用GO,什么时候应该使用分号;?

在SQLServer中,什么时候应该使用GO,什么时候应该使用分号;?,sql,sql-server,Sql,Sql Server,我一直不知道什么时候应该在命令后使用GO关键字,以及命令末尾是否需要分号。区别是什么?为什么/何时使用 当我在SQL Server Management Studio中运行Generate脚本时,它似乎在所有地方都使用了GO,但没有使用分号。GO仅与SSMS相关-它不是实际的Transact-SQL,它只是告诉SSMS在每个GO之间按顺序发送SQL语句 是SQL语句分隔符,但在大多数情况下,引擎可以解释语句的分解位置 主要例外情况,以及的位置最常用于公共表表达式语句之前。GO是批处理终止符,分号

我一直不知道什么时候应该在命令后使用GO关键字,以及命令末尾是否需要分号。区别是什么?为什么/何时使用


当我在SQL Server Management Studio中运行Generate脚本时,它似乎在所有地方都使用了GO,但没有使用分号。

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

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


主要例外情况,以及
的位置
最常用于公共表表达式语句之前。

GO是批处理终止符,分号是语句终止符


当您希望在一个脚本中有多个create proc语句时,您将使用GO,因为create proc必须是批处理中的第一条语句。如果使用公共表表达式,则需要使用分号终止之前的语句

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

当然,SQL Server通常允许您省略语句终止符,但为什么要养成坏习惯呢

正如其他人指出的,公共表表达式(CTE)前面的语句必须以分号结尾。因此,从那些没有完全接受分号终止符的人身上,我们可以看到:

;WITH ...
我觉得这看起来很奇怪。我认为,在一个在线论坛上,当你不能说出它将粘贴到的代码的质量时,这是有意义的

此外,
MERGE
语句必须以分号结尾。你看到一个模式了吗?这些是TSQL的两个新添加项,它们严格遵循SQL标准。看来SQL Server团队正在强制使用分号终止符。

GO Go是一个分批分离器。这意味着该批中的所有内容都是该特定批的本地内容

变量、表变量等的任何声明都不会跨越
go
语句

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

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

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


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

在生成的DDL脚本中看到这么多GO的原因是因为以下关于批处理的内容

创建默认值,创建函数, 创建过程,创建规则,创建 触发器,并创建视图语句 不能与其他 批处理中的语句。创造 语句必须开始批处理。全部的 随后的其他声明 批处理将被解释为 第一次创建的定义 声明


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

强调
GO
不是t-SQL部分,而
isA
MERGE
语句必须以分号终止。更新:在SQL Server 2012中,不建议使用分号,这意味着在下一版本中需要分号。因此,使用分号是一种很好的做法,因为在迁移的情况下它需要更少的工作(因为它是一种标准)。来源:或SQL Server 2012:SQL 2014上的书仍然列出了下一版本所需的分号。我不知道它什么时候会被弃用+buli并不是说
已弃用,不使用它已弃用,即,根据源代码,它将成为必需的。可能重复的
MERGE
语句必须用分号终止。
MERGE
语句必须用分号终止。这是唯一真正回答“…何时使用GO…”问题的人问题的一部分。在我看来,GO终止了创建包含SQL的对象的语句,SQL可能包含;语句终止符。在另一个DBMS中,我看到了设置终止字符串的功能。例如,您可以指定语句以两个管道字符| |结尾。然后您可以发出创建过程。。。很多SQL以;…||结尾双管道结束CREATE PROCEDURE语句。所以我的问题是,这是否是对微软GO声明的分析?第二,你能在SQLSERVER中重新定义终止字符串吗?@youcantryreachingme我不知道这在2010年是否是真的,但似乎你能。看见我不确定这有什么局限性在回答围棋部分时,它没有解决它和分号之间的区别。“我认为这看起来很奇怪”——我完全同意。不断重复这一点会导致一些奇怪的问题,比如,SQL Server不允许您草率行事——它允许您省略多余的语句终止符;与大多数其他SQL一样,T-SQL不是纯粹的标准SQL,它更像是一个抽象基类-在实践中不使用DB引擎自己的方言。@ProfK:感谢您在评论中加入标点符号,使我易于阅读和理解,特别是句子结束符。尽管您对连字符的使用不符合标准英语……但是,SQL Management Studio脚本生成向导生成插入内容时不使用分号和GOs。如果我想在SSM之外高效导入数据转储,也许我应该用COMMIT替换所有GOs(并添加相应的BEGIN事务)。