SQL Server Management Studio 和 Transact SQL 中的 GO 有啥用?

Posted

技术标签:

【中文标题】SQL Server Management Studio 和 Transact SQL 中的 GO 有啥用?【英文标题】:What is the use of GO in SQL Server Management Studio & Transact SQL?SQL Server Management Studio 和 Transact SQL 中的 GO 有什么用? 【发布时间】:2011-01-18 22:42:58 【问题描述】:

当我使用右键单击“脚本为”菜单创建查询时,SQL Server Management Studio 总是插入一个 GO 命令。为什么? GO 究竟做了什么?

【问题讨论】:

@ChrisF -- 这不是重复的,尽管接受的答案也回答了这个问题。这个问题是关于在事务中使用“GO”——结果证明它根本不是一个真正的 SQL 命令。这个问题更加笼统,并试图为有关 SSMS 中的 GO 命令的问题提供明确的答案。 也可以看看这个链接:What are batching statements good for? 微软文档:SQL Server Utilities Statements - GO:GO前面的批处理会执行指定的次数。 【参考方案1】:

它是一个批处理终止器,但是您可以将其更改为您想要的任何内容

【讨论】:

gbn 使它成为 SELECT 并看看会发生什么:-) 谢谢!但是,GO 语句的意义何在?这听起来可能很愚蠢,但“代码批”是什么意思? msdn 在 GO 后表示变量的生命周期到期。听起来与交易承诺无关,对吧?在什么情况下我应该在脚本中保留 GO 语句? 这意味着它之前的所有 T-SQL 将“立即”执行。据我了解,它可以与分号(OLEDB/Oracle)互换。例如,如果您有一个大型部署后脚本,则行之间的 GO 语句可能有助于脚本中使用的内存。 这个答案并没有真正解释“它实际上做了什么”或为什么 @Andrew 我同意...我仍然不知道批处理终止符在这种情况下应该是什么意思【参考方案2】:

自 Management Studio 2005 以来,您似乎可以将 GOint 参数一起使用,例如:

INSERT INTO mytable DEFAULT VALUES
GO 10

上面将在mytable 中插入 10 行。一般来说,GO会执行相关的sql命令n

【讨论】:

简约是极致的精致。达芬奇 “相关的sql命令”是什么意思?是上面的命令吗?上面的所有命令?上面的命令直到上一个 GO 有的话?【参考方案3】:

GO 命令不是 Transact-SQL 语句,而是被包括 SQL Server Management Studio 代码编辑器在内的多个 MS 实用程序识别的特殊命令。

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

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

【讨论】:

在什么情况下使用GO 进行批处理真的有用? @nicodemus13 见***.com/questions/20711326/… 所以如果批处理中的 1 个语句失败,是否全部失败?【参考方案4】:

GO 不是 SQL 关键字。

它是客户端工具(如 SSMS)用来将整个脚本分成多个批次的批次分隔符

之前回答过好几次了...example 1

【讨论】:

在我的辩护中,我在提交问题之前确实查看了建议的重复项 - 尽管答案适用,但您的示例没有出现,也不是真正的重复项。 这里很难搜索“GO” :-)【参考方案5】:

只是添加到现有答案中,当您创建视图时,您必须使用 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

【讨论】:

同时创建程序 这是唯一真正解决 OP 问题第一部分的答案“......总是插入一个 GO 命令......为什么?”。大多数时候,似乎是出于恐惧。唯一需要的是命令必须在它自己的批处理中。【参考方案6】:

Go 意味着,无论在它之前和之前的任何 GO 之后编写的任何 SQL 语句,都将转到 SQL Server 进行处理。

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”,尽管应该先执行选择,但您可以获得更新的员工?【参考方案7】:
Use herDatabase
GO ; 

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

【讨论】:

为什么没有“GO”就不能工作?我刚刚测试了它 - 没有区别。 “GO”对于“USE”语句似乎是多余的。【参考方案8】:

我没有看到列出的一种用法是错误恢复。 由于一次只运行两个 GO 之间的命令,这意味着一个命令中的编译错误可以与其他命令分开。通常批处理中的任何编译错误都会导致整个事情无法执行。

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

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

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

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

'sel' 和以前一样出现错误,但 'here' 确实有输出。

【讨论】:

【参考方案9】:

当我希望在处理其他查询之前完成一组查询时,我会使用 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

【讨论】:

以上是关于SQL Server Management Studio 和 Transact SQL 中的 GO 有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

怎样使用SQL Server Management Studio

标题: Microsoft SQL Server Management Studio

使用 SQL Server Management Studio 连接到 SQL Server

如何在 SQL Server Management Studio 中注册 SQL Server 服务器?

SQL Server Compact Edition 和 SQL Server 2008 Management Studio

从 SQL Server 2016 到 SQL Server Management Studio 2005 的 ETL