ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

S
SQLMenace

https://imgur.com/TpChF.png


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

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

INSERT INTO mytable DEFAULT VALUES
GO 10

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


简单是终极的复杂。列奥纳多·达·芬奇
“相关的sql命令”是什么意思?是上面的命令吗?上面的所有命令?上面的命令直到上一个 GO 如果有的话?
t
tvanfosson

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

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

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


在什么情况下使用 GO 进行批处理实际上有用?
因此,如果批处理中的 1 条语句失败,是否全部失败?
C
Community

GO 不是 SQL 关键字。

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

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


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

只是为了添加到现有答案中,当您创建视图时,您必须使用 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 命令......为什么?”。大多数时候,似乎是出于恐惧。唯一需要的是命令必须在它自己的批处理中。
这个答案就是为什么这个 GO 命令真的很重要
A
Adil H. Raza

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”,尽管应该首先执行选择,但您可以获得更新的员工?
A
AeroX
Use herDatabase
GO ; 

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


为什么没有“GO”它就不能工作?我刚刚测试了它 - 没有区别。对于“USE”语句,“GO”似乎是多余的。
J
Jamshaid K.

当我希望一组查询在继续其他查询之前获得 committed 时,我使用 GO 关键字。

我可以补充一点,当您在 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

更新

我明白了,人们要求何时使用 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'

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


到目前为止,唯一有意义的答案。谢谢!
T
Thomas Oatman

我没有看到列出的一种用法是错误恢复。由于一次只运行两个 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' 确实会得到输出。