【问题标题】:What is the difference between ; and GO in stored procedure in SQL Server?和有什么区别?和 GO 在 SQL Server 的存储过程中?
【发布时间】:2010-02-22 11:11:12
【问题描述】:

SQL Server 存储过程中;GO 有什么区别?

实际上,如果我在 SQL Server 中有一个存储过程,并且想在其中放置 t 个单独的查询,第一个查询只计算记录数(计数),第二个查询根据某些条件选择一些记录,那么应该我在这两个查询之间使用?

Go;

【问题讨论】:

    标签: sql-server stored-procedures


    【解决方案1】:

    ; 只是结束语句。

    GO 不是一个语句,而是一个命令服务器将当前批次提交到数据库。它会在交易中创建一个止损点。

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

    (更新,感谢 cmets):
    据我所知,GO 是针对管理工作室的声明,可能也适用于其他工具。

    【讨论】:

    • 其实go在“管理工作室”之外是多余的。不过我不会(-1)。
    • 尝试通过SqlCommand执行一个带有GO的语句,它会抛出异常。
    • 没错,它是对客户端工具(SSMS、osql、sqlcmd 等)的命令,而不是对服务器的命令。在其中一些工具中,命令可以定义为其他序列。尽管如果有人这样做,我会含蓄地讨厌他们以及他们创建的所有脚本。 :-|
    • 是的,go 是操作它的中间查询客户端工具的命令
    【解决方案2】:

    分号分隔查询,GO 命令分隔批次。 (另外,GO 不是 T-SQL 命令,它是 sqlcmd 和 osql 实用程序和 Management Studio 识别的命令。)

    您不能在存储过程中使用 GO。如果你愿意尝试,程序的定义将到此结束,其余的将是一个单独的批处理。

    局部变量具有批处理的作用域,因此在执行 GO 命令之后,您不能使用在 GO 命令之前声明的局部变量:

    declare @test int
    
    set @test = 42
    
    GO
    
    select @Test -- causes an error message as @Test is undefined
    

    【讨论】:

      【解决方案3】:

      我知道这个帖子很旧,但我认为这些其他用途/差异对于像我这样的其他关于 GO 的搜索可能会很方便。

      1. GO 之后的任何内容都不会在您的存储过程中结束,因为GO 将执行CREATE/ALTER PROCEDURE 命令。例如,如果你运行这个......

        创建过程 X 作为 选择 1 作为 X 去 选择 2 作为 X

      然后在运行它之后你返回编辑程序你会发现只有SELECT 1 As X在那里,因为GO创建了sproc,之后的任何东西都被认为是你接下来要做的事情,并且不是存储过程的一部分。

      1. 我很惊讶我没有看到很多关于这个的提及,但是批处理分隔符不仅特定于您正在查询的程序,而且在 SSMS 的情况下它实际上是用户可编辑的!如果我进入设置并将批处理分隔符从 GO 更改为 XX,那么在我的 SSMS 副本中,XX 执行批处理而不是 GO。那么如果我尝试执行包含 GO 的存储过程会发生什么?

      GO 视为告诉 SSMS 将其上方的任何内容发送到服务器以执行的一种方式。服务器永远不会收到GO,因为它只是用来标记您希望 SSMS 发送到服务器的一批命令的结束。 如果您有需要在存储过程中控制执行流程的场景,那么您可以使用 BEGIN TRANSACTIONCOMMIT TRANSACTION 来实现,这些在存储过程中是允许的。

      【讨论】:

        【解决方案4】:

        GO 不是对服务器的命令,它是 MS 提供的大多数客户端工具的默认批处理分隔符。当客户端工具自己在新的一行遇到“GO”时,它会将迄今为止积累的所有命令发送到服务器,然后重新开始。

        这意味着在一个批次中声明的任何变量在后续批次中都不可用。这也意味着不能将多行 cmets 放在“GO”命令周围 - 因为服务器将看到第一批,并看到未终止的注释。

        【讨论】:

          【解决方案5】:

          它标志着查询分析器中批处理的结束,并且 因此表示该批处理中存储过程定义的结束。 据我所知,它不是 sp 的一部分。 GO 不是 TSQL 命令。

          和;结束语句。

          【讨论】:

            猜你喜欢
            • 2015-10-28
            • 2011-07-08
            • 2013-06-19
            • 2016-02-25
            • 2015-09-25
            • 2010-09-18
            • 2018-06-21
            • 1970-01-01
            • 2016-07-30
            相关资源
            最近更新 更多