GO 在 SQLServerManagementStudio 和 TransactSQL 中的用途是什么?

当我使用右键单击“ ScriptAs”菜单创建查询时,SQLServerManagementStudio 始终插入 GO 命令。为什么?GO 到底是做什么的?

391326 次浏览

GO命令不是Transact-SQL语句,而是几个MS实用程序(包括SQL Server Management Studio代码编辑器)可以识别的特殊命令。

GO命令用于将SQL命令分组,并一起发送到服务器。批处理中包含的命令,即自上一个GO命令或会话开始以来的命令集,必须在逻辑上一致。例如,您不能在一个批处理中定义一个变量,然后在另一个批处理中使用它,因为变量的范围仅限于定义它的批处理。

更多信息,参见http://msdn.microsoft.com/en-us/library/ms188037.aspx

GO不是SQL关键字。

它是客户端工具(如SSMS)使用的批处理分隔符,用于将整个脚本分解为批处理

之前回答过几次…示例1

它是一个批处理结束符,但是你可以将它更改为任何你想要的 alt text

Use herDatabase
GO ;

代码表示执行GO标记上面的指令。 我的默认数据库是myDatabase,所以不是使用myDatabase GO,并使当前查询使用herDatabase

从Management Studio 2005开始,你似乎可以使用带有int参数的GO,比如:

INSERT INTO mytable DEFAULT VALUES
GO 10

上述语句将在mytable中插入10行。一般来说,__ABC1将执行相关的sql命令n

只是为了添加到现有的答案,当你创建视图时,你必须使用go将这些命令分成批量,否则你会得到错误'CREATE VIEW' must be the only statement in the batch。因此,例如,如果没有go,您将无法执行以下sql脚本

create view MyView1 as
select Id,Name from table1
go
create view MyView2 as
select Id,Name from table1
go


select * from MyView1
select * from MyView2

Go的意思是,无论SQL语句写在它之前和任何更早的Go之后,都将去SQL服务器进行处理。

Select * from employees;
GO    -- GO 1


update employees set empID=21 where empCode=123;
GO    -- GO 2

在上面的例子中,在GO 1之前的语句将在一个批处理中进入sql server,然后在GO 2之前的任何其他语句将在另一个批处理中进入sql server。我们可以看到它是分开的批次。

我还没有看到的一个用法是错误恢复。 由于一次只运行两个go之间的命令,这意味着一个命令中的编译错误可以与其他命令分开。通常情况下,批处理中的任何编译错误都会导致整个事情无法执行
exec do.Something
GO
sel from table
print 'here'
GO
print 'there'

在上面的例子中,'here'将不会被打印出来,因为'sel'语句中存在错误。

现在,在中间添加一个GO:

exec do.Something
GO
sel from table
GO
print 'here'
GO
print 'there'

像以前一样,'sel'得到一个错误,但'here'得到输出。

当我想要一组查询在进入其他查询之前获得committed时,我使用GO关键字。

我可以添加的一个的事情是,当你在GO命令之前声明了一些变量时,你将无法在GO命令之后访问这些变量。即

DECLARE @dt DateTime = GETDATE();
UPDATE MyTable SET UpdatedOn = @dt where mycondition = 'myvalue';
GO


-- Below query will raise an error saying the @dt is not declared.
UPDATE MySecondTable SET UpdatedOn = @dt where mycondition = 'myvalue'; -- Must declare the scalar variable "@dt".
GO

更新

我看到,人们询问什么时候使用Go命令,所以我想,我应该在我的查询中添加为什么我使用Go命令。

当我在表中有大量更新时,我通常在下班时运行这些更新(这意味着,我不会监视查询),因为第二天很方便,可以发现表已经为其他操作做好了准备。

我使用Go命令,当我需要运行长时间的操作,并希望分离查询和完成部分事务,如:

-- First Query
Update MyBigTable SET somecol1='someval1' where somecol2='someval2'
GO
-- Second Query
Update MyBigTable1 SET somecol1='someval1' where somecol2='someval2'
GO
-- Third Query
Update MyBigTable3 SET somecol1='someval1' where somecol2='someval2'

执行上述查询将单独提交修改,而不会导致生成大量的回滚日志。另外,如果第三个查询失败,您知道前两个查询是正确执行的,并且不会回滚任何东西。因此,您不需要花费更多的时间为以前执行的查询再次更新/删除记录。