GO在SQL Server Management Studio和Transact SQL中有什么用?

tva*_*son 337 t-sql sql-server ssms

使用右键单击"脚本为"菜单创建查询时,SQL Server Management Studio始终插入GO命令.为什么?GO实际上做了什么?

SQL*_*ace 289

它是批量终止符,但您可以将其更改为您想要的任何内容 替代文字

  • gbn让它选择并看看会发生什么:-) (78认同)
  • 谢谢!然而,GO声明的重点是什么?这可能听起来很愚蠢,但"批量代码"是什么意思?[msdn](http://msdn.microsoft.com/en-us/library/ms188037.aspx)在GO之后说变量的生命周期到期.与交易承诺没有任何关系吗?在任何情况下我都应该在脚本中保留GO语句吗? (11认同)
  • 这意味着它之前的所有T-SQL都将"立即"执行.据我所知,它可以与分号(OLEDB/Oracle)互换.例如,如果您有一个大的部署后脚本,行之间的GO语句可能有助于脚本中使用的内存. (3认同)
  • @Andrew我同意...我仍然不知道批处理终止符在这种情况下意味着什么 (3认同)
  • 这个答案并没有真正解释“它实际上做什么”或原因 (2认同)

Mic*_*Sim 283

由于管理Studio 2005中似乎就可以使用GO同一个int参数,如:

INSERT INTO mytable DEFAULT VALUES
GO 10
Run Code Online (Sandbox Code Playgroud)

以上将插入10行mytable.一般来说,GO会执行相关的sql命令n次数.

  • “相关sql命令”是什么意思?是上面的命令吗?以上所有命令?上面的命令直到上一个GO是否有? (4认同)
  • 简单是最终的复杂。列奥纳多·达·芬奇 (3认同)

tva*_*son 188

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

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

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms188037.aspx.

  • 在什么情况下使用"GO"进行批处理实际上有用? (32认同)
  • 所以如果批处理中的1个语句失败,那么全部失败吗? (4认同)
  • @ nicodemus13请参阅http://stackoverflow.com/questions/20711326/sql-server-what-is-go-good-for (3认同)

gbn*_*gbn 35

GO不是SQL关键字.

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

几次回答...... 例子1

  • 这里很难搜索"GO":-) (24认同)
  • 在我的辩护中,我确实在提交问题之前查看了建议的副本 - 并且您的示例没有显示,也不是真的重复,尽管答案是适用的. (4认同)

Myk*_*ych 16

只是要添加到现有答案中,在创建视图时必须将这些命令分成批处理go,否则您将收到错误'CREATE VIEW' must be the only statement in the batch.因此,例如,如果没有,您将无法执行以下sql脚本go

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

  • 还创建程序 (2认同)
  • 这是真正解决OP的第一部分问题的唯一答案:“始终插入GO命令。为什么?”。似乎大多数时候,出于恐惧。唯一需要的时间是命令必须位于其自己的批处理中。 (2认同)

Jam*_*ran 13

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

我可以补充的一件事是,当您在命令之前声明了一些变量时,GO您将无法访问GO命令之后的变量。IE

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

更新

我看到,人们要求何时使用该Go命令,所以我想,我应该Go在查询中添加使用该命令的原因。

当我在表中有大量更新时,我通常会在下班时运行这些更新(这意味着我不会监视查询),因为第二天来并找到准备好进行其他操作的表很方便。

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

-- First Query
Update MyBigTable1 SET somecol1='someval1' where somecol2='someval2'
GO
-- Second Query
Update MyBigTable2 SET somecol1='someval1' where somecol2='someval2'
GO
-- Third Query
Update MyBigTable3 SET somecol1='someval1' where somecol2='someval2'
Run Code Online (Sandbox Code Playgroud)

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

用一句话来概括,“我GO在电子游戏中一样使用命令作为检查点。” 如果您在检查点(GO 命令)之后失败,则无需重新开始,而是从最后一个检查点开始游戏。


Ton*_*nyP 6

Use herDatabase
GO ; 
Run Code Online (Sandbox Code Playgroud)

代码表示执行GO标记上方的指令.我的默认数据库是myDatabase,因此不使用myDatabase GO并使当前查询使用herDatabase

  • 为什么没有“GO”它就不能工作?我刚刚测试过 - 没有区别。“GO”对于“USE”语句来说似乎是多余的。 (2认同)

小智 6

Go意味着,无论在其之前和之后的任何早期编写的SQL语句如何,都将转到SQL服务器进行处理。

Select * from employees;
GO    -- GO 1

update employees set empID=21 where empCode=123;
GO    -- GO 2
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,GO 1之前的语句将成批进入sql服务器,然后GO 2之前的任何其他语句将成批进入sql服务器。因此,正如我们所见,它已分批处理。