在检查web上的一些代码和SQL Server Management Studio生成的脚本时,我注意到一些语句以分号结束。
那么什么时候用呢?
在检查web上的一些代码和SQL Server Management Studio生成的脚本时,我注意到一些语句以分号结束。
那么什么时候用呢?
当前回答
个人意见:只在需要的地方使用它们。(请参阅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
其他回答
当在包含其他语句的批处理中使用DISABLE或ENABLE TRIGGER语句时,它前面的语句必须以分号结束。否则,您将得到一个语法错误。我用这个把头发都扯掉了……后来,我偶然发现了这个MS Connect项目。它关闭了,无法修复。
在这里看到的
分号似乎不应该与游标操作一起使用:OPEN, FETCH, CLOSE和DEALLOCATE。我在这上面浪费了几个小时。我仔细查看了BOL,并注意到[;]没有显示在这些游标语句的语法中!!
所以我有:
OPEN mycursor;
这给了我错误16916。
But:
OPEN mycursor
工作。
根据Transact-SQL语法约定(Transact-SQL) (MSDN)
Transact-SQL语句结束符。虽然在这个版本的SQL Server中,分号在大多数语句中都不是必需的,但在未来的版本中,分号将是必需的。
(另见@gerryLowry的评论)
如果你想在SQLServer中得到随机的命令超时错误,那么在CommandText字符串的末尾去掉分号。
我不知道这是否在任何地方都有记录,或者这是否是一个错误,但它确实发生了,我从痛苦的经验中学到了这一点。
我有可验证的和可重复的例子使用SQLServer 2008。
在实践中,即使你只是向数据库发送一条语句,也要包含结束符。
分号在复合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)