什么是“批处理”,为什么使用 GO?

我已经阅读和阅读了 MSDN 等,好了,所以它标志着一批的结束。

批处理的定义是什么?我不明白为什么我需要去当我粘贴在一堆脚本运行在同一时间。

我一直不明白。有人能更好地解释这一点吗? 什么时候我需要使用它(在多少次或什么类型的事务之后) ?

例如,为什么每次更新后我都需要 GO:

 UPDATE [Country]
SET [CountryCode] = 'IL'
WHERE code = 'IL'


GO


UPDATE [Country]
SET [CountryCode] = 'PT'
WHERE code = 'PT'
71747 次浏览

有时需要一遍又一遍地执行相同的命令或命令集。这可能是为了插入或更新测试数据,也可能是为了在服务器上加载性能测试。无论如何,最简单的方法是设置 while 循环并执行代码,但是在 SQL2005中有一种更简单的方法。

假设您想创建一个测试表,并用1000条记录加载它。您可以发出以下命令,它将运行相同的命令1000次:

CREATE TABLE dbo.TEST (ID INT IDENTITY (1,1), ROWID uniqueidentifier)
GO
INSERT INTO dbo.TEST (ROWID) VALUES (NEWID())
GO 1000

来源: Http://www.mssqltips.com/tip.asp?tip=1216

除此之外,它标志着 SQL 块的“结束”(例如在存储过程中) ... ... 这意味着你又处于“干净”状态... ... 例如: 语句中使用的参数在代码重置之前(不再定义)

GO正确地是 没有,是一个 TSQL 命令。

相反,它是一个指向特定 客户程序的命令,连接到一个 SQL 服务器(Sybase 或微软的——不确定 Oracle 是做什么的) ,向客户端程序发出信号,告诉客户端程序直到“ go”之前输入的一组命令需要发送到服务器执行。

为什么/什么时候需要?

  • GO 在 MSSQL 服务器有一个“ count”参数-所以你可以使用它作为一个“重复 N 次”快捷方式。

  • 极大的更新可能会填满 SQL 服务器的日志。为了避免这种情况,可能需要通过 go将它们分成较小的批次。

    在您的示例中,如果对一组国家代码的更新的容量大到将耗尽日志空间,那么解决方案是将每个国家代码分成一个单独的事务——这可以通过在客户机上使用 go将它们分离来完成。

  • 有些 SQL 语句必须用 GO 与下列语句分开才能正常工作。

    例如,您不能在一个事务中删除一个表并重新创建相同名称的表,至少在 Sybase 中不能(对于创建过程/触发器也是如此) :

> drop table tempdb.guest.x1
> create table tempdb.guest.x1 (a int)
> go
Msg 2714, Level 16, State 1
Server 'SYBDEV', Line 2
There is already an object named 'x1' in the database.
  

> drop table tempdb.guest.x1
> go
> create table tempdb.guest.x1 (a int)
> go
>

许多命令需要在它们自己的批处理中,如 CREATE PROCEDURE

或者,如果向表中添加列,那么它应该在自己的批处理中。 如果尝试在同一批中选择新列,则会失败,因为在解析/编译时该列不存在。

GO 被 SQL 工具用来从一个脚本中解决这个问题: 它不是 SQL 关键字,也不被引擎识别。

这是批处理的日常使用的两个具体例子。

编辑: 在您的示例中,您不需要 GO..。

编辑2,例子。您不能在一个批处理中删除、创建和授权... ... 尤其是,存储过程的结束在哪里?

IF OBJECT_ID ('dbo.uspDoStuff') IS NOT NULL
DROP PROCEDURE dbo.uspDoStuff
GO
CREATE PROCEDURE dbo.uspDoStuff
AS
SELECT Something From ATable
GO
GRANT EXECUTE ON dbo.uspDoStuff TO RoleSomeOne
GO

GO不是一个语句,它是一个批分离器。

GO分隔的块由客户机发送到服务器进行处理,客户机等待它们的结果。

例如,如果你写

DELETE FROM a
DELETE FROM b
DELETE FROM c

,这将作为单个 3行查询发送到服务器。

如果你写

DELETE FROM a
GO
DELETE FROM b
GO
DELETE FROM c

,这将作为 3一行查询发送到服务器。

GO本身不会进入服务器(没有双关语的意思)。它是一个纯粹的客户端保留字,只能被 SSMSosql识别。

如果您使用自定义查询工具通过连接发送它,服务器甚至不会识别它并发出错误。

正如大家已经说过的,“ GO”不是 T-SQL 的一部分。“ GO”是一个批分隔符 在 SSMS 中,这是一个用于向数据库提交查询的客户机应用程序。这意味着声明的变量和表变量将不会从“ GO”之前的代码持久化到后面的代码。

事实上,GO 只是 SSMS 使用的 违约单词。如果需要,可以在选项中更改此选项。为了找点乐子,改变别人系统上的选项,使用“ SELECT”作为批分离器,而不是“ GO”。原谅我残忍的笑声。

它用于分割逻辑块。您的代码被解释为 sql 命令行,这表示下一个代码块。

但是它可以用作具有特定数字的递归语句。

试试:

exec sp_who2
go 2

有些陈述必须由 GO 加以界定:

use DB
create view thisViewCreationWillFail