在检查web上的一些代码和SQL Server Management Studio生成的脚本时,我注意到一些语句以分号结束。
那么什么时候用呢?
在检查web上的一些代码和SQL Server Management Studio生成的脚本时,我注意到一些语句以分号结束。
那么什么时候用呢?
当前回答
默认情况下,SQL语句以分号结束。除非(很少)设置了新的语句结束符,否则可以使用分号来终止语句。
如果你只发送一条语句,技术上来说你可以不用语句结束符;在脚本中,当您发送多个语句时,就需要它。
在实践中,即使只向数据库发送一条语句,也应始终包含结束符。
编辑:对于那些说语句终止符不是[特定的RDBMS]所要求的,虽然这可能是真的,但它们是ANSI SQL标准所要求的。在所有的编程中,如果我们能够在不损失功能的情况下坚持一个标准,我们就应该这样做,因为这样我们的代码或习惯就不会受制于一个专有的供应商。
对于一些C编译器,main可以返回void,尽管标准要求main返回int。但是这样做会使我们的代码和我们自身的可移植性降低。
有效编程的最大困难不是学习新东西,而是忘记坏习惯。从某种程度上说,我们可以避免养成坏习惯,这对我们、对我们的代码,以及任何阅读或使用我们代码的人来说都是一种胜利。
其他回答
如果你想在SQLServer中得到随机的命令超时错误,那么在CommandText字符串的末尾去掉分号。
我不知道这是否在任何地方都有记录,或者这是否是一个错误,但它确实发生了,我从痛苦的经验中学到了这一点。
我有可验证的和可重复的例子使用SQLServer 2008。
在实践中,即使你只是向数据库发送一条语句,也要包含结束符。
摘自Ken Powers在SQLServerCentral.Com上的文章:
分号
分号字符是语句结束符。它是ANSI SQL-92标准的一部分,但从未在Transact-SQL中使用过。事实上,编写T-SQL代码好几年都不会遇到分号。
使用
有两种情况必须使用分号。第一种情况是使用公共表表达式(CTE),而CTE不是批处理中的第一个语句。第二种情况是您发出一个servicebroker语句,而servicebroker语句不是批处理中的第一个语句。
如果我没有看错的话,需要使用分号来结束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/
我仍然有很多关于T-SQL的知识要学习,但在为事务编写一些代码(并基于来自stackoverflow和其他站点的示例代码)时,我发现了一个情况,其中似乎需要分号,如果缺少分号,语句似乎根本不执行,也没有引发错误。以上的答案似乎都没有涉及到这一点。(本文使用的是MS SQL Server 2012。)
一旦我让事务以我想要的方式工作,我决定在它周围放一个try-catch,这样如果有任何错误,它就会回滚。只有在这样做之后,事务才没有提交(SSMS在试图关闭窗口时确认这一点,并发出一条漂亮的消息,提醒您有一个未提交的事务。
所以这
COMMIT TRANSACTION
在BEGIN TRY/END TRY块外可以很好地提交事务,但在块内必须如此
COMMIT TRANSACTION;
注意,没有提供错误或警告,也没有指示在尝试关闭查询选项卡之前事务仍然未提交。
幸运的是,这导致了一个巨大的问题,立即就可以明显地看出有问题。不幸的是,由于没有报告错误(语法或其他),所以问题并不明显。
相反,ROLLBACK TRANSACTION在BEGIN CATCH块中使用分号或不使用分号似乎都同样有效。
这可能有一定的逻辑,但它给人的感觉是武断的,像爱丽丝梦游仙境一样。
默认情况下,SQL语句以分号结束。除非(很少)设置了新的语句结束符,否则可以使用分号来终止语句。
如果你只发送一条语句,技术上来说你可以不用语句结束符;在脚本中,当您发送多个语句时,就需要它。
在实践中,即使只向数据库发送一条语句,也应始终包含结束符。
编辑:对于那些说语句终止符不是[特定的RDBMS]所要求的,虽然这可能是真的,但它们是ANSI SQL标准所要求的。在所有的编程中,如果我们能够在不损失功能的情况下坚持一个标准,我们就应该这样做,因为这样我们的代码或习惯就不会受制于一个专有的供应商。
对于一些C编译器,main可以返回void,尽管标准要求main返回int。但是这样做会使我们的代码和我们自身的可移植性降低。
有效编程的最大困难不是学习新东西,而是忘记坏习惯。从某种程度上说,我们可以避免养成坏习惯,这对我们、对我们的代码,以及任何阅读或使用我们代码的人来说都是一种胜利。