【问题标题】:SQL Server: Do I need to use GO statements between batches?SQL Server:我需要在批次之间使用 GO 语句吗?
【发布时间】:2010-10-02 08:30:55
【问题描述】:

我见过人们在一批 SQL 代码之间使用 GO 语句,但 AFAICS 不是强制性的(SQL Server 2008)。在批次/组 SQL 语句之间使用 GO 语句有什么好处?

【问题讨论】:

    标签: sql sql-server sql-server-2005 sql-server-2008


    【解决方案1】:

    它们不是严格要求的 - 它们只是 SQL Server Management Studio 执行到目前为止的语句的指令,然后继续执行。 GO 不是 T-SQL 关键字或任何东西 - 它只是在 SSMS 中工作的指令。

    有时,您需要一个 GO - 例如。如果在表中添加一列,然后想再次选择它,则需要在添加列和查询它之间有一个 GO。

    例如如果您尝试执行此操作,您将收到来自 SSMS 的错误:

    ALTER TABLE (sometable) ADD DateTimeStamp DATETIME
    
    SELECT ID, DateTimeStamp FROM (sometable) WHERE ID > 5
    

    结果:

    消息 207,第 16 级,状态 1,第 9 行 列名“日期时间戳”无效。

    重点是:SSMS 试图一次验证整个语句,但是在 SELECT 语句上,它会抱怨缺少 DateTimeStamp 列。

    ALTER TABLE (sometable) ADD DateTimeStamp DATETIME
    GO       
    
    SELECT ID, DateTimeStamp FROM (sometable) WHERE ID > 5
    

    如果您在两个语句之间放置一个GO,它将起作用,因为 SSMS 不会提前解析和验证整个语句 - 它会执行第一部分,然后只解析第二部分(之后GO)。

    但除了这种情况之外,几乎不需要 GO。

    【讨论】:

    • 是的,你不能在没有中间的情况下添加列和操作它,但是你可以创建表并在没有 go 的情况下进行插入,这很奇怪。
    • 这个特性叫做延迟编译stackoverflow.com/questions/20711326/…
    【解决方案2】:

    仅在 SQL 工具中强制要求告诉 SSMS 批处理开始和结束的位置。某些语句也需要它,例如 CREATE TRIGGER,它必须是批处理中的第一个

    例如,在 c# 到 SQL Server 的调用中,它没有任何意义

    【讨论】:

      猜你喜欢
      • 2014-01-09
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多