In SQL Server, when should you use GO and when should you use semi-colon ;?

I’ve always been confused with when I should use the GO keyword after commands and whether a semi-colon is required at the end of commands. What is the differences and why/when I should use them?

When I run the Generate-script in SQL Server Management Studio, it seems to use GO all over the place, but not the semi-colon.

73750 次浏览

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

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

主要的异常和最常使用 ;的位置是在公共表表达式语句之前。

GO is a batch terminator, a semi-colon is a statement terminator.

you will use GO when you want to have multiple create proc statements in 1 script because create proc has to be the first statement in a batch. If you use common table expressions then the statement before it needs to be terminated with a semi-colon

您应该使用分号来终止每个 SQL 语句,

当然,SQLServer 通常允许您省略语句结束符,但是为什么要养成坏习惯呢?

正如其他人指出的,公共表表达式(CTE)之前的语句必须以分号结束。因此,从那些还没有完全接受分号终结者的人们身上,我们看到了这样的结果:

;WITH ...

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

此外,MERGE语句必须以分号结束。你看出规律了吗?这些是 TSQL 最新添加的一些内容,它们严格遵循 SQL 标准。看起来 SQLServer 团队正在沿着强制使用分号终止符的道路前进。

GO

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

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

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

分号

分号是一个语句结束符,它纯粹用来标识一个特定的语句已经结束。

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

CTE's however, demand that the WITH is the first statement so you need a semicolon before the WITH.

之所以在 Generated DDL 脚本中看到这么多 GO,是因为下面关于批处理的 rule

创建默认值,创建函数, 创建程序,创建规则,创建 触发器和 CREATEVIEW 语句 cannot be combined with other statements in a batch. The CREATE 语句必须开始批处理 other statements that follow in that 批次将被解释为 第一个 CREATE 的定义 statement.

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