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


100

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

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


3
可能重复的“;”之间
JohnFx 2010年

Answers:


93

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

;是一个SQL语句分隔符,但在大多数情况下,发动机可以解释其中的语句被打破了。

主要例外以及;最常使用的地方是在通用表表达式语句之前。


5
对重点GO不是T-SQL语句组成部分,同时;
msarchet

2
一个MERGE语句必须由一个分号终止。
2010年

15
更新:不建议在SQL Server 2012中不使用分号,这意味着在下一版本中将需要使用分号。因此,使用分号是一个好习惯,因为在迁移的情况下(因为它是标准),因此所需的工作量更少。来源:technet.microsoft.com/zh-cn/library/ms143729.aspx或有关SQL Server 2012的书:shop.oreilly.com/product/0790145321978.do –PawełBulwan
2013年

1
SQL 2014仍根据下一个版本的要求列出分号。我不知道什么时候会过时。technet.microsoft.com/zh-CN/library/ms143729.aspx
弗兰克

2
+ buli并不表示;已弃用,不使用它不被弃用,即根据来源,它将变为强制性的。
cjk

78

在生成的DDL脚本中看到这么多GO的原因是由于以下有关批处理的规则

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

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


10
这是唯一真正回答“ ...您何时应使用GO ...?”的人。问题的一部分。
罗默2013年

在我看来,GO会终止创建包含SQL的对象的语句,这些SQL可能包含; 语句终止符。在另一个DBMS中,我看到了设置终止字符串的能力。例如,您可以指定语句以两个管道字符||结尾。然后,您可以发出CREATE PROCEDURE ...很多以结尾的SQL;... || 并且双管道结束了CREATE PROCEDURE语句。所以我的问题是,这是否与MS GO语句相吻合?其次,您可以在SQLSERVER中重新定义终止字符串吗?
youcantryreachingme

@youcantryreachingme我不知道2010年是否如此,但似乎可以。请参阅SSMS:批次分隔符。我不确定这样做的局限性是什么
康拉德·弗里克斯

34

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

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

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

分号

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

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

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


4
一个MERGE语句必须由一个分号终止。
2010年

11

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

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

正如其他人指出的那样,公共表表达式(CTE)之前的语句必须以分号终止。结果,从尚未完全接受分号终止符的人们中,我们看到了这一点:

;WITH ...

我认为看起来真的很奇怪。我想当您无法确定将要粘贴到的代码的质量时,在在线论坛中这是有意义的。

此外,MERGE语句必须以分号终止。在这里看到图案吗?这些是对TSQL的一些较新的补充,它们严格遵循SQL标准。看起来SQL Server团队正在强制使用分号终止符。


2
我认为这真的很奇怪 ”-我完全同意。这导致像奇怪的问题的不断重复还是
a_horse_with_no_name

SQL Server不允许您草率-它允许您省略冗余语句终止符;与大多数其他SQL一样,T-SQL也不是纯标准SQL,它更像是抽象基类-在实践中并未使用来支持DB引擎自己的方言。
ProfK

@ProfK:感谢您在评论中加入标点符号,这使我更易于阅读和理解,尤其是句子终止符。虽然,你的连字符不符合标准的英语用法...
onedaywhen

8

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

如果要在一个脚本中包含多个create proc语句,则将使用GO,因为create proc必须是批处理中的第一个语句。如果使用公用表表达式,则该语句之前需要用分号终止


一个MERGE语句必须由一个分号终止。
2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.