当我使用右键单击“脚本为”菜单创建查询时,SQL Server Management Studio 总是插入一个 GO 命令。为什么? GO 实际上做了什么?
https://imgur.com/TpChF.png
从 Management Studio 2005 开始,您似乎可以将 GO
与 int
参数一起使用,例如:
INSERT INTO mytable DEFAULT VALUES
GO 10
以上将在 mytable
中插入 10 行。一般来说,GO
会执行相关的sql命令n
次。
GO 命令不是 Transact-SQL 语句,而是被包括 SQL Server Management Studio 代码编辑器在内的多个 MS 实用程序识别的特殊命令。
GO 命令用于将 SQL 命令分组到一起发送到服务器的批处理。批处理中包含的命令,即自上一个 GO 命令或会话开始以来的命令集,必须在逻辑上保持一致。例如,您不能在一个批次中定义一个变量,然后在另一个批次中使用它,因为变量的范围仅限于定义它的批次。
有关详细信息,请参阅 http://msdn.microsoft.com/en-us/library/ms188037.aspx。
GO
进行批处理实际上有用?
GO 不是 SQL 关键字。
它是客户端工具(如 SSMS)用来将整个脚本分成多个批次的批处理分隔符
之前回答过几次... example 1
只是为了添加到现有答案中,当您创建视图时,您必须使用 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 意味着,无论在它之前和之前的任何 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。所以我们看到它有分开的批次。
Use herDatabase
GO ;
代码表示要执行 GO
标记上方的指令。我的默认数据库是 myDatabase,所以不要使用 myDatabase GO
,而是使用 herDatabase 进行当前查询
当我希望一组查询在继续其他查询之前获得 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'
执行上述查询将单独提交修改,而不会导致大量的回滚日志形成。另外,如果第三个查询失败,您知道前两个查询已正确执行,并且不会回滚。因此,您无需为先前执行的查询再次花费更多时间更新/删除记录。
我没有看到列出的一种用法是错误恢复。由于一次只运行两个 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' 确实会得到输出。
不定期副业成功案例分享