【问题标题】:using GO keyword in SQL Server在 SQL Server 中使用 GO 关键字
【发布时间】:2011-07-08 14:31:13
【问题描述】:

我知道 GO 关键字的用法。它将多个语句作为一个整体发送到 sql server,而不是一个一个地发送每个语句。我希望我是对的!

但我想知道程序员是否在实际应用程序中使用它。就像如果我们创建一个存储过程,那么它也做同样的事情,它也会编译代码并制定执行计划,并将整个组发送到服务器。

那么我们需要在触发器、视图、存储过程等数据库对象的编码中指定GO关键字吗?

【问题讨论】:

    标签: c# sql sql-server sql-server-2005 tsql


    【解决方案1】:

    GO 是用于发出批处理结束信号的命令。请注意,它不是 T-SQL 语句。

    批处理是一组一个或多个 Transact-SQL 语句同时从应用程序发送到 SQL Server 以供执行

    GO 在 SQL Server 中非常有用。不过,只有在真正需要时才需要使用它。 因此,您需要记住,除了使用 GO 命令定义批处理之外,您还定义了特定 T-SQL 代码的范围。批处理中定义的局部变量特定于该批处理。

    范围示例 -

    DECLARE @STRING1 AS VARCHAR(50)
    DECLARE @STRING2 AS VARCHAR(50)
    
    SET @STRING1='BATCH 2'
    SET @STRING2='BATCH 3'
    
    SELECT @STRING1 AS RESULT
    GO
    
    SELECT @STRING2 AS RESULT
    GO
    

    运行它会给你一个错误,说@STRING2 没有被声明。因为该变量的范围以 GO 结尾。所以小心使用 GO 并巧妙使用。

    来源 - http://aartemiou.blogspot.com/2009/08/using-go-command-in-sql-server.html

    【讨论】:

    • @sqlchild - 这是一个合乎逻辑的决定,您需要根据应用程序中的触发器、视图和 SP 的类型来做出决定。
    • 另外说明,如果您使用 ADODB 或 OleDB 以编程方式运行查询,则使用 GO 语句将产生错误。它是查询分析器/SQL Server Management Studio 中使用的特殊关键字。对于 SSMS,这可在“选项”中进行配置 - 位于“工具”菜单中。 Query Execution->SQL Server->General 下的“Batch Separator”设置包含关键字 GO。
    【解决方案2】:

    GO 关键字向 SQL Server Management Studio 发出批处理结束的信号 - 通常 SQL Server Management Studio 在单个批处理中执行所有语句(可以将批处理视为数据库的往返),但是在某些情况下,可能需要分批执行语句(例​​如,SET SHOWPLAN_ALL 语句必须是批处理中的唯一语句)

    例如,在 SQL Server Management Studio 中执行以下脚本:

    USE StackOverflow
    GO
    SELECT * FROM Comments
    

    大致相当于在 C# 中执行以下操作:

    using (var cmd = new SqlCommand("USE StackOverflow", conn))
    {
        cmd.ExecuteReader();
    }
    using (var cmd = new SqlCommand("SELECT * FROM Comments", conn))
    {
        cmd.ExecuteReader();
    }    
    

    注意GO不是 T-SQL 关键字,它只有 SQL Server Management Studio 和其他 SQL 工具才能理解。例如以下将不起作用,并会导致运行时异常:

    string cmdText = @"
    USE StackOverflow
    GO
    SELECT * FROM Comments";
    
    using (var cmd = new SqlCommand(cmdText, conn))
    {
        cmd.ExecuteReader();
    }
    

    【讨论】:

      【解决方案3】:

      GO 不是 SQL 中的关键字。这是 SSMS 和其他工具将较大的脚本分成批处理的指令。

      【讨论】:

        【解决方案4】:

        补充一下其他人所说的...您实际上不能在存储过程、触发器、视图、UDF 甚至动态 SQL 中使用 GO。它仅用于脚本。

        【讨论】:

          【解决方案5】:

          我怀疑你最好使用分号 (;) 来分隔语句。

          【讨论】:

          • 这无关紧要。 GO 是一个批处理分隔符。分号是语句分隔符。您可以在一个批处理中拥有多个语句。顺便说一句,你甚至不需要使用“GO”这个词。 GO 在 SSMS 选项中默认设置。如果您愿意,理论上可以将其设置为其他词。如果你真的很邪恶 (@rob_farley) 并且一位同事的屏幕未锁定,你可以将其设置为,哦,让我们说“SELECT”,然后当他们回来并再次开始编码时,会出现混乱和令人讨厌的错误消息。每次 SSMS 看到 SELECT 一词时,它都会认为“嘿,批处理结束了!”
          【解决方案6】:

          不需要在 SQL server 中指定 GO 指令。

          【讨论】:

            【解决方案7】:

            MSDN Defines Go as

            向 SQL Server 实用程序发出一批 Transact-SQL 语句结束的信号。

            接着说

            GO 不是 Transact-SQL 语句;它 是 sqlcmd 识别的命令 和 osql 实用程序和 SQL Server Management Studio 代码编辑器。

            SQL Server 实用程序将 GO 解释为 表示他们应该发送 当前批次的 Transact-SQL 对 SQL 实例的语句 服务器。目前批次 语句由所有 自上次 GO 以来输入的语句, 或自特设开始以来 如果这是第一个会话或脚本 去吧。

            我最常使用 GO 的时间是对象创建脚本

            我的创建脚本通常遵循这种模式

            USE SomeDatabase
            GO
            
            If Exists(SELECT * FROM ...)
             DROP
            
            CREATE PROC as foo
            BEGIN
            END
            GO 
            
            Grant exec on Foo to Bar
            

            所以这两个 GO 很重要,因为我想确保我在正确的数据库上,并且如果没有 GO,它将无法工作。第二个 GO 至关重要,否则存储过程将尝试将授权语句作为过程的一部分运行。

            【讨论】:

              猜你喜欢
              • 2010-11-13
              • 2010-10-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-25
              • 2011-03-06
              • 1970-01-01
              相关资源
              最近更新 更多