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语句,然后在执行时运行探查器。 你会看到它们作为单独的命令发送到服务器。

分号用于表示语句本身的结束,不一定是整个批次。

http://msdn.microsoft.com/en-us/library/ms188037.aspx

“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 transactionend transaction包装成可能失败或一起成功的单个语句集合。

';' 通常用于将多个SQL语句彼此分开。 这在需要返回多个logging集的SQL脚本中是很明显的,比如`select * from table1; 从表2中select*;' 这将导致在客户端的两个单独的logging集。

  1. 在SQL Server TSQL(2005 – 2016)下记住:

    • 分号(;)是终止符。
    • GO是批量终结者。
  2. 此外,可以使用GO使用以下语法多次调用相同的DML块:

GO [count]

其中[count]是一个正整数,表示反复执行所述GO之前的TSQL命令块的次数。

  1. 另外,与分号不同,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提交所有以前的命令。