我使用ADO.NET和sqlcmd实用程序将SQL脚本发送到SQL Server 2008.使用;
和GO
分隔SQL块有什么区别?
答案 0 :(得分:57)
GO
实际上不是T-SQL命令。 Microsoft工具引入了GO
命令,作为分离批处理语句(如存储过程结束)的一种方法。 Microsoft SQL堆栈工具支持GO
,但它不是其他工具的正式部分。
您不能将GO
放入SQL字符串中,并将其作为ADO.NET命令对象的一部分发送,因为SQL本身不理解该术语。另一种证明这一点的方法是使用分析器:在查询分析器/ Management Studio中设置一些使用GO
的语句,然后在执行时运行分析器。您将看到它们作为单独的命令发布到服务器。
分号用于表示语句本身的结尾,不一定是整批。
答案 1 :(得分:35)
“GO”类似于;在许多情况下,但实际上确实意味着批次的结束。
当调用“GO”语句时,每个批处理都会被提交,所以如果你有:
SELECT * FROM table-that-does-not-exist;
SELECT * FROM good-table;
在你的批处理中,那么好的表选择永远不会被调用,因为第一次选择会导致错误。
如果您改为:
SELECT * FROM table-that-does-not-exist
GO
SELECT * FROM good-table
GO
第一个select语句仍会导致错误,但由于第二个语句在自己的批处理中,它仍然会执行。
GO与提交交易无关。
答案 2 :(得分:21)
分号是一个语句分隔符。遇到分号时,不一定要执行上一个语句。
GO
表示批次结束。执行前一批语句,就像遇到块结束一样。
GO 2
表示多次执行批处理。我想我可能在生活中使用过两次这个选项。再说一遍,我不是交易DBA。
答案 3 :(得分:8)
在SQL Server TSQL(2005 - 2016)下,请记住:
此外,GO可用于使用以下语法多次调用相同的DML块:
GO [count]
其中[count]是一个正整数,表示一遍又一遍地执行所述GO之前的TSQL命令块的次数。
drop view #temporary_view
GO
创建视图#another_view ...
- >没有错误
如果您在上一个示例中使用分号替换了GO,则会引发以下错误消息:
'CREATE VIEW'必须是查询批次中的第一个语句。
答案 4 :(得分:4)
'GO'通常用于表示SQL语句的批处理的结束,这意味着您可以将begin transaction
和end transaction
包装到单个集合中可能失败或一起成功的陈述。
';'通常用于将多个SQL语句彼此分开。这在需要返回多个记录集的SQL脚本中是显而易见的,例如`select * from table1; select * from table2;'这会在客户端产生两个独立的记录集。
答案 5 :(得分:2)
命令GO表示批处理结束。 因此,GO命令之前在GO之前声明的所有变量都是无效的。 对分号不会结束批次。
如果您将在过程中使用DML命令,请使用分号代替GO。 例如:
CREATE PROCEDURE SpMyProc
@myProcParam VARCHAR(20)
AS
DECLARE @myOtherParam INT = 5
;DISABLE TRIGGER ALL ON tMyTable
UPDATE tMyTable SET myVar = @myProcParam, mySecondVar = @myOtherParam
;ENABLE TRIGGER OLL ON tMyTable
答案 6 :(得分:0)