在检查web上的一些代码和SQL Server Management Studio生成的脚本时,我注意到一些语句以分号结束。

那么什么时候用呢?


当前回答

当在包含其他语句的批处理中使用DISABLE或ENABLE TRIGGER语句时,它前面的语句必须以分号结束。否则,您将得到一个语法错误。我用这个把头发都扯掉了……后来,我偶然发现了这个MS Connect项目。它关闭了,无法修复。

在这里看到的

其他回答

根据Transact-SQL语法约定(Transact-SQL) (MSDN)

Transact-SQL语句结束符。虽然在这个版本的SQL Server中,分号在大多数语句中都不是必需的,但在未来的版本中,分号将是必需的。

(另见@gerryLowry的评论)

摘自Ken Powers在SQLServerCentral.Com上的文章:

分号

分号字符是语句结束符。它是ANSI SQL-92标准的一部分,但从未在Transact-SQL中使用过。事实上,编写T-SQL代码好几年都不会遇到分号。

使用

有两种情况必须使用分号。第一种情况是使用公共表表达式(CTE),而CTE不是批处理中的第一个语句。第二种情况是您发出一个servicebroker语句,而servicebroker语句不是批处理中的第一个语句。

如果我没有看错的话,需要使用分号来结束TSQL语句。 http://msdn.microsoft.com/en-us/library/ms143729%28v=sql.120%29.aspx

编辑: 我找到了SSMS 2008R2的一个插件,它将格式化脚本并添加分号。我想它还在测试阶段…

http://www.tsqltidy.com/tsqltidySSMSAddin.aspx

编辑: 我发现了一个更好的免费工具/插件叫ApexSQL… http://www.apexsql.com/

当在包含其他语句的批处理中使用DISABLE或ENABLE TRIGGER语句时,它前面的语句必须以分号结束。否则,您将得到一个语法错误。我用这个把头发都扯掉了……后来,我偶然发现了这个MS Connect项目。它关闭了,无法修复。

在这里看到的

分号在复合SELECT语句中并不总是有效。

比较一个普通复合SELECT语句的两个不同版本。

的代码

DECLARE @Test varchar(35); 
SELECT @Test=
    (SELECT 
        (SELECT 
            (SELECT 'Semicolons do not always work fine.';););); 
SELECT @Test Test;

返回

Msg 102, Level 15, State 1, Line 5
Incorrect syntax near ';'.

然而,代码

DECLARE @Test varchar(35)
SELECT @Test=
    (SELECT 
        (SELECT 
            (SELECT 'Semicolons do not always work fine.'))) 
SELECT @Test Test

返回

Test
-----------------------------------
Semicolons do not always work fine.

(1 row(s) affected)