1> select name, create_date
2> from sys.objects
3> where name = 'foo'
4> go
name create_date
--------- -----------
foo 2020-07-20 09:56:42.393
(1 rows affected)
1>
我想在这里补充一点,如果您在不同的语句之间添加 Go 语句,它将继续执行您的查询,而不管抛出任何错误。如果您跳过 Go 语句,那么您的执行将在任何错误后停止,并且不会执行下一个语句。最好的用例,例如,如果您有多个插入语句,并且如果插入语句中有任何错误(您可能只需要执行日志),您希望继续执行,那么请编写此批处理分隔符。如果你想在有错误的语句处停止执行,想进行一些更改然后继续执行,不要写 GO 分隔符。
GO
不是 TSQL 语言的一部分。它是 SQLCMD 和 SSMS 使用的批处理分隔符。SQL Server 实用程序语句 - GO
它起源于命令行界面,并且一直存在于 sqlcmd 中。您可以在命令行界面中通过多行编写批处理,并且在您键入
go
.您可以在 SSMS 中配置用于批处理分隔符的内容。
GO
是默认值,但它可以是其他任何东西。它将命令拆分为单独的批次。
例如,变量的作用域以
GO
.;
分隔命令但不结束作用域。GO
分隔批次和结束范围。您可能会认为它好像整个命令被分割
GO
并且每个部分本身都被执行。IE。
这有效:
但这不起作用:
这些是解释:
;
=是语句终止符。不是强制性的,但可能是一天。现在你必须在两种情况下使用它:GO
=是一个批处理分隔符。它告诉 SQL Server “在此停止并在继续之前执行所有以前的代码”。不是强制性的,但有一个功能适合您:如果您编写GO 10
,GO 100
,GO 1000
它将执行同一批代码10
,100
,1000
次GO
对 SQL Server 本身没有任何意义,但由将脚本发送到 SQL Server 的工具(例如 SSMS 或 SQLCMD)解释。其他一些工具可能无法理解“GO”。一些工具的解释GO
略有不同。在 SSMS 中,每个批次都在同一个会话中执行,因此事务可以跨批次,至少 SQL Server 包含的一些命令行工具不会为文件中的每个批次维护相同的会话,因此打开的事务将在以下情况下回滚遇到 GO。GO 在其他答案中得到了很好的解决。让我添加一些关于分号的内容:
很久很久以前,这不是我们使用的东西。但 SQL 标准 (ANSI/ISO SQL) 规定 SQL 语句应以分号结尾。所以在某个版本,MS 允许它遵守 ANSI SQL。但它曾经是,而且大部分仍然是,无操作。即,有没有没有关系
在发明 SQL 语言时(我还是个孩子)我没有参与其中,但我可以想象分号被指定为语句终止符以简化 SQL 的解析。即,当您向数据库引擎提交 SQL 时,它首先必须解析(基本上理解您所说的)语句。您可能可以想象,如果引擎中的解析代码可以查找某些表示“语句结束”的字符,那么它可能会更容易。因此分号。但正如我所指出的,SQL Server 没有使用分号进行解析。
现在,随着时间的推移,引入的一些新语言元素要求前面的语句以分号结尾(如 CTE 和 THROW 中的两个示例)。没有它,SQL Server 无法解析(理解您所说的),并且您在解析阶段生成了一个错误。
有一次,MS 表示不推荐使用不以分号结尾的语句。即,他们试图让我们相信,在某个时间点(某个未来版本),我们必须以分号结束我们的所有陈述。我可能不是唯一一个觉得这有点有趣的人——想象一下向后兼容性方面!跳到现在,如果您阅读文档,您会发现情况不再如此(事实上,今天没有弃用的功能 - 没有!)。
我想在这里补充一点,如果您在不同的语句之间添加 Go 语句,它将继续执行您的查询,而不管抛出任何错误。如果您跳过 Go 语句,那么您的执行将在任何错误后停止,并且不会执行下一个语句。最好的用例,例如,如果您有多个插入语句,并且如果插入语句中有任何错误(您可能只需要执行日志),您希望继续执行,那么请编写此批处理分隔符。如果你想在有错误的语句处停止执行,想进行一些更改然后继续执行,不要写 GO 分隔符。