当前位置:  开发笔记 > 编程语言 > 正文

我什么时候应该在SQL Server中使用分号?

如何解决《我什么时候应该在SQLServer中使用分号?》经验,为你挑选了6个好方法。

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

那么什么时候应该使用它?



1> TheTXI..:

来自Ken Powers 的SQLServerCentral.Com 文章:

分号

分号字符是语句终止符.它是ANSI SQL-92标准的一部分,但从未在Transact-SQL中使用.实际上,可以在不遇到分号的情况下对T-SQL进行编码.

用法

在两种情况下,您必须使用分号.第一种情况是使用公用表表达式(CTE),而CTE不是批处理中的第一个语句.第二个是发出Service Broker语句,Service Broker语句不是批处理中的第一个语句.


是"THROW"是Service Broker的声明吗?在这个例子中,我们需要在抛出之前包括一个分号:`BEGIN; THROW @Error,'Invalid FundingID',2; 返回结束
@maurocam我认为您错误地阅读了该文档.如果您查看该链接,则会显示"**Not**结束带分号的Transact-SQL语句." 已弃用.

2> tpdi..:

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

如果您只发送一份声明,从技术上讲,您可以免除声明终止符; 在脚本中,当您发送多个语句时,您需要它.

实际上,即使您只是向数据库发送一个语句,也始终包含终止符.

编辑:响应那些说法语句[特定RDBMS]不需要语句终结符,虽然这可能是真的,但它们是ANSI SQL标准所要求的.在所有编程中,如果我们能够在不损失功能的情况下遵守标准,我们就应该这样做,因为那时我们的代码或习惯都不会与一个专有供应商联系在一起.

对于一些C编译器,即使标准要求main返回int,也可能使main返回void.但这样做会使我们的代码和我们自己的可移植性降低.

有效编程的最大困难不是学习新事物,而是学习不良习惯.在某种程度上,我们可以首先避免获得不良习惯,这对我们,我们的代码以及任何阅读或使用我们代码的人来说都是一种胜利.



3> GSerg..:

在SQL2008 BOL中,他们说在下一版本中需要使用分号.因此,请始终使用它.

参考:

Transact-SQL语法约定(Transact-SQL)

SQL Server 2008 R2中不推荐使用的数据库引擎功能("SQL Server未来版本不支持的功能"部分,"Transact-SQL"区域)



4> Spidermain50..:

如果我正确读取,则需要使用分号来结束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/



5> gotqn..:

必须使用它.

使用分号终止语句的做法是标准的,实际上是其他几个数据库平台的要求.SQL Server仅在特定情况下需要分号 - 但在不需要分号的情况下,使用分号不会导致问题.我强烈建议您采用以分号结束所有语句的做法.这样做不仅可以提高代码的可读性,而且在某些情况下可以为您节省一些麻烦.(如果需要分号且未指定分号,则SQL Server生成的错误消息并不总是非常清楚.)

最重要的是:

SQL Server文档表明,不使用分号终止T-SQL语句是不推荐使用的功能.这意味着长期目标是在产品的未来版本中强制使用分号.这是养成终止所有陈述的习惯的另一个原因,即使在目前不需要的情况下也是如此.

来源: Itzik Ben-Gan的Microsoft SQL Server 2012 T-SQL基础知识.


您始终必须使用的一个示例;是以下两个查询(从此帖子复制):

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

在此输入图像描述


这似乎是一个强有力的论据,你*应该*使用分号(由引号支持),但只有一个案例,其中有*must*.
对,*应*,我同意.但他的第一行答案强调**必须**,但事实并非如此 - 至少还没有.
@Gregor,如果宣布使用分号是必须的并且"不使用它们"是不推荐的技术,你应该使用它们.如果没有,将来有遭受的风险.如果您不打算升级/切换作业并始终使用SQL Server 2000,那么您是安全的:-)
带分号的示例在SQL Server 2008(10.0.6241.0)上导致“ THROW”附近的语法不正确。这是我在工作时必须处理的版本。它的工作原理如2012年所示。由于过时,我被说服开始使用分号。我预计大多数时候在2008年都不会出现问题。

6> Rob Garrison..:

个人意见:仅在需要时使用.(有关所需列表,请参阅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


我很高兴您清楚地说这只是您的意见,但是我认为这不是一个很好的答案,因为它与Microsoft文档和ANSI标准都相冲突。我认为发表评论会更好。(不试图抨击您,您完全有权使用分号!)
推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有