SQL Server Management Studio总是插入一个GO命令时,我创建一个查询使用右键单击“脚本作为”菜单。为什么?GO到底是做什么的?
当前回答
tldr;在大多数情况下,围棋是IMO可选的。在大型事务批处理中使用GO是最好的,在这种情况下,您可以将许多不同的脚本一起编译在一个大型脚本中,并且不希望在使用类似变量时出现错误,以便在需要时将部分事务提交给服务器,而不是由于错误而回滚所有脚本。
LARGE TRANSACTION 1——>运行成功
去,——>在服务器中
LARGE TRANSACTION 2——>运行成功
去,——>在服务器中
LARGE TRANSACTION 3—>错误
去,如果没有其他GO语句,这将回滚事务1和事务2
不确定最好的方式来提供这个如此明智,但我确实觉得我读到的东西并没有真正地总结一切,包括我遇到的一个例子。
如前所述,GO只是向服务器“提交”一批命令。
我认为理解会话还有助于理解GO语句的必要性(或可选性)。
(这是我的技术细节可能会失败的地方,但社区会指出来,我们可以让这个答案更好)
通常,开发人员在单个会话中工作,通常只对数据库执行简单的语句。在这种情况下,GO是可选的,真的……人们只会把它扔在语句的末尾。
Jamshaid k给出的一个选项可能更有帮助,在这个选项中,您希望依次提交许多大型事务,而不是在其中一个事务失败时回滚所有事务。
在另一个场景中,这也很有用(这是我经历过的唯一一个场景),许多小事务被编译成一个大脚本。例如
开发人员1制作脚本1
Dev 2制作脚本2
开发人员1制作脚本3
为了部署它们,需要编写一个python脚本来组合这些脚本,即script Master = script1 + script 2 + script 3。
这3个脚本中需要GO语句,否则脚本使用冲突变量时可能会出现错误,或者如果脚本3失败,脚本1和脚本2中的事务将回滚。
现在,考虑到目前的CI/CD解决方案,这个过程可能已经过时了,但这可能是另一种情况,我可以看到GO是有帮助的/预期的。
其他回答
GO命令不是Transact-SQL语句,而是几个MS实用程序(包括SQL Server Management Studio代码编辑器)可以识别的特殊命令。
GO命令用于将SQL命令分组,并一起发送到服务器。批处理中包含的命令,即自上一个GO命令或会话开始以来的命令集,必须在逻辑上一致。例如,您不能在一个批处理中定义一个变量,然后在另一个批处理中使用它,因为变量的范围仅限于定义它的批处理。
欲了解更多信息,请参见http://msdn.microsoft.com/en-us/library/ms188037.aspx。
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意思是让SQL重复这个你在它后面加上的数字。就像用英语说;“嘿,去那里3次。”尝试下面的SQL和结果将呈现表3次。
SELECT * FROM Table
GO 3
它是一个分离查询的命令。如果你在做多次选择,它没有太大的区别,以我为例,主要用途是当我创建脚本时,你需要创建存储过程,然后授予访问或执行它们。例如:
CREATE OR ALTER PROCEDURE dbo.select1
AS
BEGIN
SET NOCOUNT ON
SELECT 1
END
EXEC dbo.select1
它将创建包含所有内容的存储过程,包括EXEC,它将在循环中结束。 GO语句会说,在结束后创建存储过程,然后执行。
CREATE OR ALTER PROCEDURE dbo.select1
AS
BEGIN
SET NOCOUNT ON
SELECT 1
END
GO
EXEC dbo.select1
tldr;在大多数情况下,围棋是IMO可选的。在大型事务批处理中使用GO是最好的,在这种情况下,您可以将许多不同的脚本一起编译在一个大型脚本中,并且不希望在使用类似变量时出现错误,以便在需要时将部分事务提交给服务器,而不是由于错误而回滚所有脚本。
LARGE TRANSACTION 1——>运行成功
去,——>在服务器中
LARGE TRANSACTION 2——>运行成功
去,——>在服务器中
LARGE TRANSACTION 3—>错误
去,如果没有其他GO语句,这将回滚事务1和事务2
不确定最好的方式来提供这个如此明智,但我确实觉得我读到的东西并没有真正地总结一切,包括我遇到的一个例子。
如前所述,GO只是向服务器“提交”一批命令。
我认为理解会话还有助于理解GO语句的必要性(或可选性)。
(这是我的技术细节可能会失败的地方,但社区会指出来,我们可以让这个答案更好)
通常,开发人员在单个会话中工作,通常只对数据库执行简单的语句。在这种情况下,GO是可选的,真的……人们只会把它扔在语句的末尾。
Jamshaid k给出的一个选项可能更有帮助,在这个选项中,您希望依次提交许多大型事务,而不是在其中一个事务失败时回滚所有事务。
在另一个场景中,这也很有用(这是我经历过的唯一一个场景),许多小事务被编译成一个大脚本。例如
开发人员1制作脚本1
Dev 2制作脚本2
开发人员1制作脚本3
为了部署它们,需要编写一个python脚本来组合这些脚本,即script Master = script1 + script 2 + script 3。
这3个脚本中需要GO语句,否则脚本使用冲突变量时可能会出现错误,或者如果脚本3失败,脚本1和脚本2中的事务将回滚。
现在,考虑到目前的CI/CD解决方案,这个过程可能已经过时了,但这可能是另一种情况,我可以看到GO是有帮助的/预期的。
推荐文章
- 在SQL server查询中将NULL替换为0
- 在SQL中修改表的模式名
- 如何得到累计和
- 如何在SQL Server 2005的一条语句中更新两个表?
- 如何创建临时表与SELECT * INTO tempTable从CTE查询
- 在SQL Server的选择语句中使用带TOP的变量,而不是动态的
- SQL变量保存整数列表
- 在SQL中转换月号到月名函数
- 改变一个varchar列的最大长度?
- 如何在SQL中从DateTime格式获取时间?
- 暂时关闭约束(MS SQL)
- WHERE子句中的IF子句
- 如何在SSMS中从ntext或nvarchar(max)查看所有文本?
- 创建表如果在SQL Server中不存在
- MSSQL错误“底层提供者在打开时失败”