2009-10-04 137 views

回答

50

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

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

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

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

+0

我开始连接试图让GO成为一个有效的t-sql命令:https://connect.microsoft.com/SQLServer/feedback/details/3138257/make-go-a-first-class-语言的关键字 – 2017-07-26 08:02:08

21

分号是语句分隔符。当遇到分号时,前面的语句不一定执行。

GO 

表示批次结束。执行前一批语句,就像遇到块的结尾一样。

GO 2 

表示多次执行批次。我想我在我的生活中可能使用过两次这样的选项。然后再次,我不是贸易的DBA。

0

我以为;字符分隔了一系列SQL命令,GO只是指示SQL Server提交所有先前的命令。

4

“GO”通常用来表示SQL语句的一批这意味着你可以有一个begin transactionend transaction包裹成可能会失败或共同成功语句的一个集合的结束。

';'通常用于将多个SQL语句彼此分开。这在需要返回多个记录集的SQL脚本中很明显,比如`select * from table1;从table2选择*;''这将在客户端产生两个单独的记录集。

27

“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与提交交易无关。

1

命令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 
2
  1. 下的SQL Server TSQL(2005至2016年)牢记的是:

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

GO [COUNT]

其中[COUNT]是一个正整数,指示在所述GO之前的命令的TSQL块将多次执行一遍又一遍。

  • 此外,与分号,GO是一个新的DDL之前强制性,比方说,当创建新的视图,因为分号分隔以前的命令将触发一个错误。例如:
  • 降视图#temporary_view
    GO
    创建视图#another_view ...
    - > NO错误

    如果你在前面的例子用分号取代GO,它会引发以下错误消息:

    'CREATE VIEW'必须是查询批处理中的第一条语句。

    相关问题