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

那么什么时候用呢?


当前回答

在SQL2008 BOL中,他们说在下一个版本中将需要分号。因此,要经常使用它。

参考:

Transact-SQL语法约定 SQL Server 2008 R2中已弃用的数据库引擎特性(“SQL Server未来版本不支持的特性”部分,“Transact-SQL”区域)

其他回答

分号在复合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)

个人意见:只在需要的地方使用它们。(请参阅TheTXI的回答,以获得所需的列表。)

因为编译器不需要它们,你可以把它们放在所有地方,但是为什么呢?编译器不会告诉你在哪里忘记了一个,所以你最终会使用不一致。

[此意见是针对SQL Server的。其他数据库可能有更严格的要求。如果您正在编写运行在多个数据库上的SQL,您的需求可能会有所不同。

Tpdi上面说过,“在脚本中,当您发送多个语句时,就需要它。”这其实是不对的。你不需要他们。

PRINT 'Semicolons are optional'
PRINT 'Semicolons are optional'
PRINT 'Semicolons are optional';
PRINT 'Semicolons are optional';

输出:

Semicolons are optional
Semicolons are optional
Semicolons are optional
Semicolons are optional

默认情况下,SQL语句以分号结束。除非(很少)设置了新的语句结束符,否则可以使用分号来终止语句。

如果你只发送一条语句,技术上来说你可以不用语句结束符;在脚本中,当您发送多个语句时,就需要它。

在实践中,即使只向数据库发送一条语句,也应始终包含结束符。

编辑:对于那些说语句终止符不是[特定的RDBMS]所要求的,虽然这可能是真的,但它们是ANSI SQL标准所要求的。在所有的编程中,如果我们能够在不损失功能的情况下坚持一个标准,我们就应该这样做,因为这样我们的代码或习惯就不会受制于一个专有的供应商。

对于一些C编译器,main可以返回void,尽管标准要求main返回int。但是这样做会使我们的代码和我们自身的可移植性降低。

有效编程的最大困难不是学习新东西,而是忘记坏习惯。从某种程度上说,我们可以避免养成坏习惯,这对我们、对我们的代码,以及任何阅读或使用我们代码的人来说都是一种胜利。

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

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

(另见@gerryLowry的评论)

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

在这里看到的