在检查Web上的一些代码和SQL Server Management Studio生成的脚本时,我注意到某些语句以分号结束.
那么什么时候应该使用它?
来自Ken Powers 的SQLServerCentral.Com 文章:
分号
分号字符是语句终止符.它是ANSI SQL-92标准的一部分,但从未在Transact-SQL中使用.实际上,可以在不遇到分号的情况下对T-SQL进行编码.
用法
在两种情况下,您必须使用分号.第一种情况是使用公用表表达式(CTE),而CTE不是批处理中的第一个语句.第二个是发出Service Broker语句,Service Broker语句不是批处理中的第一个语句.
默认情况下,SQL语句以分号结束.除非(很少)设置新的语句终止符,否则使用分号来终止语句.
如果您只发送一份声明,从技术上讲,您可以免除声明终止符; 在脚本中,当您发送多个语句时,您需要它.
实际上,即使您只是向数据库发送一个语句,也始终包含终止符.
编辑:响应那些说法语句[特定RDBMS]不需要语句终结符,虽然这可能是真的,但它们是ANSI SQL标准所要求的.在所有编程中,如果我们能够在不损失功能的情况下遵守标准,我们就应该这样做,因为那时我们的代码或习惯都不会与一个专有供应商联系在一起.
对于一些C编译器,即使标准要求main返回int,也可能使main返回void.但这样做会使我们的代码和我们自己的可移植性降低.
有效编程的最大困难不是学习新事物,而是学习不良习惯.在某种程度上,我们可以首先避免获得不良习惯,这对我们,我们的代码以及任何阅读或使用我们代码的人来说都是一种胜利.
在SQL2008 BOL中,他们说在下一版本中需要使用分号.因此,请始终使用它.
参考:
Transact-SQL语法约定(Transact-SQL)
SQL Server 2008 R2中不推荐使用的数据库引擎功能("SQL Server未来版本不支持的功能"部分,"Transact-SQL"区域)
如果我正确读取,则需要使用分号来结束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/
你必须使用它.
使用分号终止语句的做法是标准的,实际上是其他几个数据库平台的要求.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
个人意见:仅在需要时使用.(有关所需列表,请参阅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