SQL Server 中的 GO 语句有什么作用?

Dan*_*ano 48 sql-server

GOSQL Server的语句引起了我极大的好奇,我真的不知道如何正确使用它。

我注意到有或没有的查询GO都不会返回错误并且似乎工作相同,那么它的目的是什么,我为什么要使用它?

分号;GO查询末尾有什么区别?

Dav*_*oft 77

GO不是 TSQL 语言的一部分。它是 SQLCMD 和 SSMS 使用的批处理分隔符。

GO 不是 Transact-SQL 语句;它是 sqlcmd 和 osql 实用程序以及 SQL Server Management Studio 代码编辑器识别的命令。

SQL Server 实用程序将 GO 解释为它们应该将当前一批 Transact-SQL 语句发送到 SQL Server 实例的信号。当前批次的语句由自上次 GO 以来输入的所有语句组成,或者如果这是第一次 GO,则自特别会话或脚本开始以来输入的所有语句。

Transact-SQL 语句不能与 GO 命令占用同一行。但是,该行可以包含注释。

SQL Server 实用程序语句 - GO

它起源于命令行界面,直到今天仍然存在于 sqlcmd 中。您可以在命令行界面中通过多行编写批处理,并且在您键入go.

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>
Run Code Online (Sandbox Code Playgroud)

您可以在 SSMS 中配置用于批处理分隔符的内容。GO是默认值,但它几乎可以是任何其他内容。

坚果


Vla*_*sak 23

它将命令拆分为单独的批次。

例如,变量的范围以GO.

;分隔命令但不结束作用域。
GO分隔批次并结束范围。

您可能会认为整个命令被拆分GO并且每个部分本身都被执行。

IE。

这有效:

declare @a int;
set @a = 1;
select @a
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

declare @a int
set @a = 1
GO
select @a -- will throw error as variable is not declared
Run Code Online (Sandbox Code Playgroud)


Fra*_*ani 12

这些是解释:

  • ;=是一个语句终止符。不是强制性的,但可能有一天。现在你必须在两种情况下使用它:
  1. 在公共表表达式 (CTE) 中,其中 CTE 不是批处理中的第一个语句。
  2. 当您发出 Service Broker 语句并且 Service Broker 语句不是批处理中的第一条语句时。
  • GO=是批处理分隔符。它告诉 SQL Server “在继续之前停止并执行所有先前的代码”。不是强制性的,但有一个功能适合您:如果您编写 GO 10, GO 100GO 1000它将执行同一批代码10, 100,1000

    GO对 SQL Server 本身没有任何意义,但由将脚本发送到 SQL Server 的工具(如 SSMS 或 SQLCMD)解释。其他一些工具可能无法理解“GO”。一些工具的解释GO略有不同。在 SSMS 中,每个批处理都在同一个会话中执行,因此事务可以跨批处理,至少 SQL Server 附带的某些命令行工具不会为文件中的每个批处理维护相同的会话,因此打开的事务将在以下情况下回滚遇到GO。


Tib*_*szi 9

GO 在其他答案中得到了很好的解决。让我补充一些关于分号的内容:

很久很久以前,这不是我们使用的东西。但是 SQL 标准 (ANSI/ISO SQL) 规定 SQL 语句应该以分号结尾。所以在某个版本中,MS 允许它符合 ANSI SQL。但它曾经是,而且大部分仍然是,一个无操作。也就是说,你有没有没有区别

当 SQL 语言被发明时(我还是个孩子),我没有参与,但我可以想象分号被指定为语句终止符以简化 SQL 的解析。即,当您向数据库引擎提交 SQL 时,它首先必须解析(基本上理解您所说的内容)语句。您可能可以想象,如果引擎中的解析代码可以查找某些表示“语句结束”的特定字符,那么它可能会更容易。因此分号。但正如我所指出的,SQL Server 没有使用分号进行解析。

现在,随着时间的推移,引入的一些新语言元素要求前面的语句以分号结尾(CTE 和 THROW 是两个示例)。没有它,SQL Server 就无法解析(理解你所说的)并且你在解析阶段产生了一个错误。

在同一时间MS说,没有结尾的语句分号被弃用。即,他们试图让我们相信在某个时间点(某个未来版本),我们必须以分号结束所有语句。我可能不是唯一一个觉得有点有趣的人 - 想象一下向后兼容性方面!跳到现在,如果您阅读文档,您会发现情况不再如此(实际上,今天没有不推荐使用的功能 - 没有!)。