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

那么什么时候用呢?


当前回答

如果我没有看错的话,需要使用分号来结束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/

其他回答

注意:这回答了书面的问题,但不是陈述的问题。把它添加到这里,因为人们会搜索它

在递归CTE语句中,分号也用在WITH之前:

;WITH Numbers AS
(
    SELECT n = 1
    UNION ALL
    SELECT n + 1
    FROM Numbers
    WHERE n+1 <= 10
)
SELECT n
FROM Numbers

这个查询将生成一个名为Numbers的CTE,由整数[1..10]组成。它是通过创建一个值为1的表来完成的,然后递归直到达到10。

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

你必须使用它。

The practice of using a semicolon to terminate statements is standard and in fact is a requirement in several other database platforms. SQL Server requires the semicolon only in particular cases—but in cases where a semicolon is not required, using one doesn’t cause problems. I strongly recommend that you adopt the practice of terminating all statements with a semicolon. Not only will doing this improve the readability of your code, but in some cases it can save you some grief. (When a semicolon is required and is not specified, the error message SQL Server produces is not always very clear.)

最重要的是:

SQL Server文档指出,不能用 分号是不赞成使用的特性。这意味着长期目标是强制使用 该产品的未来版本中的分号。这又多了一个进入 终止所有语句的习惯,即使目前不需要。

来源:Microsoft SQL Server 2012 T-SQL Fundamentals by Itzik Ben-Gan


举例说明为什么你总是必须使用;下面是两个查询(复制自这篇文章):

BEGIN TRY
    BEGIN TRAN
    SELECT 1/0 AS CauseAnException
    COMMIT
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE()
    THROW
END CATCH

BEGIN TRY
    BEGIN TRAN
    SELECT 1/0 AS CauseAnException;
    COMMIT
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE();
    THROW
END CATCH

如果你想在SQLServer中得到随机的命令超时错误,那么在CommandText字符串的末尾去掉分号。

我不知道这是否在任何地方都有记录,或者这是否是一个错误,但它确实发生了,我从痛苦的经验中学到了这一点。

我有可验证的和可重复的例子使用SQLServer 2008。

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

我仍然有很多关于T-SQL的知识要学习,但在为事务编写一些代码(并基于来自stackoverflow和其他站点的示例代码)时,我发现了一个情况,其中似乎需要分号,如果缺少分号,语句似乎根本不执行,也没有引发错误。以上的答案似乎都没有涉及到这一点。(本文使用的是MS SQL Server 2012。)

一旦我让事务以我想要的方式工作,我决定在它周围放一个try-catch,这样如果有任何错误,它就会回滚。只有在这样做之后,事务才没有提交(SSMS在试图关闭窗口时确认这一点,并发出一条漂亮的消息,提醒您有一个未提交的事务。

所以这

COMMIT TRANSACTION 

在BEGIN TRY/END TRY块外可以很好地提交事务,但在块内必须如此

COMMIT TRANSACTION;

注意,没有提供错误或警告,也没有指示在尝试关闭查询选项卡之前事务仍然未提交。

幸运的是,这导致了一个巨大的问题,立即就可以明显地看出有问题。不幸的是,由于没有报告错误(语法或其他),所以问题并不明显。

相反,ROLLBACK TRANSACTION在BEGIN CATCH块中使用分号或不使用分号似乎都同样有效。

这可能有一定的逻辑,但它给人的感觉是武断的,像爱丽丝梦游仙境一样。