【问题标题】:What is the difference between ";" and "GO" in T-SQL?";" 和有什么不一样和 T-SQL 中的“GO”?
【发布时间】:2009-10-04 22:14:45
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    GO 实际上不是 T-SQL 命令。 GO 命令是由 Microsoft 工具引入的,用于分隔批处理语句,例如存储过程的结尾。 GO 受 Microsoft SQL 堆栈工具支持,但不是其他工具的正式组成部分。

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

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

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

    【讨论】:

    【解决方案2】:

    "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 与提交事务无关。

    【讨论】:

      【解决方案3】:

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

      GO
      

      表示一个批次的结束。执行上一批语句,遇到块尾也是如此。

      GO 2
      

      意味着多次执行批处理。我想我一生中可能两次使用过这个选项。再说一次,我不是行业的 DBA。

      【讨论】:

        【解决方案4】:
        1. 在 SQL Server TSQL (2005 - 2016) 下,请记住:

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

        去[计数]

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

        1. 此外,与分号不同,GO 在新 DDL 之前是强制的,例如,当您创建新视图时,因为用分号分隔先前命令会触发错误。例如:

        删除视图#temporary_view
        开始
        创建视图#another_view...
        --> 没有错误

        如果您在前面的示例中将 GO 替换为分号,则会引发以下错误消息:

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

        【讨论】:

        • 最完整的答案。尤其是(3),如果被忽视,肯定会导致脚本失败。
        【解决方案5】:

        'GO' 通常用于表示 batch SQL 语句的结束,这意味着您可以将 begin transactionend transaction 包装成单个语句集合,这些语句可以一起失败或成功。

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

        【讨论】:

          【解决方案6】:

          命令 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 
          

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2012-05-27
              • 1970-01-01
              • 1970-01-01
              • 2012-11-08
              • 2011-07-22
              • 2010-11-11
              • 2011-01-18
              • 2022-01-15
              • 2021-11-29
              相关资源
              最近更新 更多