在SQL Server中,何时应该使用GO以及何时应该使用分号;?

HAd*_*des 93 sql sql-server

我总是对在命令后应该使用GO关键字以及命令末尾是否需要分号时感到困惑.有什么区别以及为什么/何时应该使用它们?

当我在SQL Server Management Studio中运行Generate-script时,它似乎在整个地方使用GO,但不是分号.

cjk*_*cjk 89

GO仅与SSMS有关 - 它不是实际的Transact SQL,它只是告诉SSMS GO按顺序在各个批次之间发送SQL语句.

;是一个SQL语句分隔符,但在大多数情况下,引擎可以解释语句的分解位置.

主要例外以及;最常使用的位置是在公用表表达式声明之前.

  • 更新:在SQL Server 2012中,不推荐使用分号,这意味着它们将在下一版本中使用.因此,使用分号是一种很好的做法,因为在迁移的情况下需要较少的工作(并且因为它是标准的).来源:http://technet.microsoft.com/en-us/library/ms143729.aspx或SQL Server 2012上的书:http://shop.oreilly.com/product/0790145321978.do (14认同)
  • 强调'GO`不是T-SQL Part而```是 (4认同)
  • SQL 2014 仍按照下一版本的要求列出分号。我想知道它什么时候会被弃用。http://technet.microsoft.com/en-us/library/ms143729.aspx (3认同)
  • "MERGE"语句必须以分号结束. (2认同)
  • +buli 并没有说明`;` 已被弃用,不推荐使用它,即根据来源它将成为强制性的。 (2认同)

Con*_*rix 74

您在生成的DDL脚本中看到如此多GO的原因是由于以下关于批处理的规则.

创建默认值,创建函数,创建过程,创建规则,创建触发器和CREATE VIEW语句不能与批处理中的其他语句组合.CREATE语句必须开始批处理.该批次中的所有其他语句将被解释为第一个CREATE语句定义的一部分.

Generated DDL的一个用例是在单个文件中生成多个对象.因此,DDL生成器必须能够生成批次.正如其他人所说,GO声明结束批次.

  • 这是唯一一个真正回答"......你什么时候应该使用GO ......?"的人.部分问题. (9认同)

Raj*_*ore 33

Go是批处理分隔符.这意味着该批次中的所有内容都是该特定批次的本地内容.

变量,表变量等的任何声明都不会跨越GO语句.

#Temp表是连接的本地表,因此它们跨越GO语句.

分号

分号是语句终止符.这纯粹用于标识特定语句已结束.

在大多数情况下,语句语法本身足以确定语句的结束.

然而,CTE要求WITH是第一个语句,因此在WITH之前需要一个分号.

  • "MERGE"语句必须以分号结束. (3认同)

one*_*hen 11

您应该使用分号来终止每个SQL语句.这在SQL标准中定义,

当然,SQL Server通常允许您省略语句终止符,但为什么会陷入坏习惯?

正如其他人所指出的那样,公共表表达式(CTE)之前的语句必须以分号结束.因此,对于尚未完全接受半结肠终结者的人,我们看到:

;WITH ...
Run Code Online (Sandbox Code Playgroud)

我认为这看起来很奇怪.我想在一个在线论坛上,当你无法分辨它将被粘贴的代码质量时,它是有道理的.

此外,MERGE语句必须以分号结束.你在这看到一个模式吗?这些是TSQL的一些新增功能,它们严格遵循SQL标准.看起来SQL Server团队正在努力使用分号终止符.

  • "*我认为看起来很奇怪*" - 我不能同意.并且不断重复这会导致奇怪的问题,如[this](http://stackoverflow.com/questions/26670414/how-use-with-in-subquery-ms-sql)或[this](http:// stackoverflow.com/questions/26233895/cte-execute-commands-before-using-the-cte-table) (2认同)

SQL*_*ace 7

GO是批量终止符,分号是语句终止符.

当你想在一个脚本中有多个create proc语句时,你将使用GO,因为create proc必须是批处理中的第一个语句.如果使用公用表表达式,那么之前的语句需要用分号终止