什么是“批次”,为什么使用GO?
我已经阅读了MSDN等。好的,所以它表示一批的结束。
什么定义了一个批次? 我不明白为什么我需要去粘贴一堆脚本来同时运行。
我从来没有理解GO。 任何人都可以更好地解释这一点,当我需要使用它(在多less或什么types的交易之后)?
例如,为什么每次更新后都需要GO?
UPDATE [Country] SET [CountryCode] = 'IL' WHERE code = 'IL' GO UPDATE [Country] SET [CountryCode] = 'PT' WHERE code = 'PT'
GO
不正确的TSQL命令。
相反,它是连接到SQL服务器的特定客户端程序 (Sybase或Microsoft的 – 不知道Oracle做什么)的命令,向客户端程序发信号通知input它的一组命令直到“去”需要被发送到服务器执行。
为什么/何时需要它?
-
去在MS SQL服务器有一个“计数”参数 – 所以你可以使用它作为“重复N次”的快捷方式。
-
极大的更新可能会填满SQL服务器的日志。 为了避免这种情况,他们可能需要通过
go
分成更小的批次。在你的例子中,如果对一组国家代码进行更新的卷的数量会超过日志空间,那么解决办法就是把每个国家代码分成一个单独的事务处理 – 这可以通过在客户端上分离它们来完成。
-
有些SQL语句必须由GO分隔,才能工作。
例如,您不能删除一个表并在单个事务中重新创build相同名称的表,至less在Sybase中(同上创build过程/触发器):
> 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 >
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
本身不去服务器(没有双关语意图)。 这是一个纯粹的客户端保留字,只能被SSMS
和osql
识别。
如果您将使用自定义查询工具通过连接发送它,服务器甚至不会识别它并发出错误。
许多命令需要在自己的批处理,如CREATE PROCEDURE
或者,如果将一列添加到表中,则应该在其自己的批次中。 如果您尝试在同一个批处理中select新列,则会失败,因为在分析/编译时该列不存在。
GO被SQL工具用来从一个脚本中解决:它不是一个SQL关键字,并且不被引擎识别。
这些是日常使用批次的两个具体例子。
编辑:在你的例子中,你不需要去…
编辑2,例如。 你不能在一个批处理中删除,创build和权限…至less,存储过程的末尾在哪里?
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
有时需要一遍又一遍地执行相同的命令或一组命令。 这可能是插入或更新testing数据,或者可能是为了进行性能testing而在服务器上加载负载。 不pipe需要什么,最简单的方法就是设置一个while循环并执行你的代码,但是在SQL 2005中有一个更简单的方法可以做到这一点。
假设您要创build一个testing表并使用1000条logging加载它。 您可以发出以下命令,它将运行相同的命令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块的“结束”(例如在一个存储过程中)…意味着你再次处于“干净”状态… eG:代码复位之前在语句中使用的参数没有定义)