“;”之间有什么区别和T-SQL中的“GO”?

时间:2009-10-04 22:14:45

标签: sql sql-server sql-server-2008 tsql

我使用ADO.NET和sqlcmd实用程序将SQL脚本发送到SQL Server 2008.使用;GO分隔SQL块有什么区别?

7 个答案:

答案 0 :(得分:57)

GO实际上不是T-SQL命令。 Microsoft工具引入了GO命令,作为分离批处理语句(如存储过程结束)的一种方法。 Microsoft SQL堆栈工具支持GO,但它不是其他工具的正式部分。

您不能将GO放入SQL字符串中,并将其作为ADO.NET命令对象的一部分发送,因为SQL本身不理解该术语。另一种证明这一点的方法是使用分析器:在查询分析器/ Management Studio中设置一些使用GO的语句,然后在执行时运行分析器。您将看到它们作为单独的命令发布到服务器。

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

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

答案 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)

  1. 在SQL Server TSQL(2005 - 2016)下,请记住:

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

  3. GO [count]

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

    1. 此外,与分号不同,GO在新DDL之前是强制,例如,当您创建新视图时,因为分隔先前命令的分号将触发错误。例如:
    2. drop view #temporary_view
      GO
      创建视图#another_view ...
      - >没有错误

      如果您在上一个示例中使用分号替换了GO,则会引发以下错误消息:

      'CREATE VIEW'必须是查询批次中的第一个语句。

答案 4 :(得分:4)

'GO'通常用于表示SQL语句的批处理的结束,这意味着您可以将begin transactionend 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)

我认为了; character分隔SQL命令列表,GO只是指示SQL Server提交所有以前的命令。