T-SQL中“;”和“GO”有什么区别?
我使用ADO.NET以及sqlcmd实用程序将SQL脚本发送到SQL Server 2008 ;
并GO
分离的SQL块?
GO
实际上并不是一个T-SQL命令。 GO
命令是由Microsoft工具引入的,用于分离批处理语句(如存储过程结束)的方法。 GO
由Microsoft SQL堆栈工具支持,但不是其他工具的正式组成部分。
您不能将GO
放入一串SQL中,并将其作为ADO.NET命令对象的一部分发送,因为SQL本身并不理解该术语。 另一种certificate这一点的方法是使用探查器:在查询分析器/pipe理工作室中设置一些使用GO
语句,然后在执行时运行探查器。 你会看到它们作为单独的命令发送到服务器。
分号用于表示语句本身的结束,不一定是整个批次。
“GO”类似于; 在许多情况下,但实际上意味着一批的结束。
当“GO”语句被调用时,每个批处理都会被提交,所以如果你有:
SELECT * FROM table-that-does-not-exist; SELECT * FROM good-table;
在你的批处理,那么良好的表select将永远不会被调用,因为第一个select将导致一个错误。
如果你有:
SELECT * FROM table-that-does-not-exist GO SELECT * FROM good-table GO
第一个select语句仍然会导致一个错误,但是由于第二个语句在它自己的批处理中,它仍然会执行。
GO与提交交易无关。
分号是语句分隔符。 当遇到分号时,前面的语句不一定被执行。
GO
表示批次的结束。 执行前一批语句,就像遇到该块的结尾一样。
GO 2
意味着多次执行批次。 我想我可能在我的生活中使用过两次。 然后再次,我不是交易的DBA。
'GO'通常用于指示一批 SQL语句的结束,这意味着您可以将begin transaction
和end transaction
包装成可能失败或一起成功的单个语句集合。
';' 通常用于将多个SQL语句彼此分开。 这在需要返回多个logging集的SQL脚本中是很明显的,比如`select * from table1; 从表2中select*;' 这将导致在客户端的两个单独的logging集。
-
在SQL Server TSQL(2005 – 2016)下记住:
- 分号(;)是块终止符。
- GO是批量终结者。
-
此外,可以使用GO使用以下语法多次调用相同的DML块:
GO [count]
其中[count]是一个正整数,表示反复执行所述GO之前的TSQL命令块的次数。
- 另外,与分号不同,GO在新的DDL之前是强制性的 ,比如说当你创build一个新的视图时,因为用分号隔开以前的命令会引发错误。 例如:
放下视图#temporary_view
走
创build视图#another_view …
– >没有错误
如果在前面的示例中用GO分号代替GO,将会引发以下错误消息:
'CREATE VIEW'必须是查询批处理中的第一条语句。
GO命令意味着批次的结束。 因此GO之前声明的所有variables在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
我以为; 字符分隔了一个SQL命令列表,GO只是指示SQL Server提交所有以前的命令。