SQL点滴29—错误无处不在

原文:SQL点滴29—错误无处不在

我只想说以下是很基础的sql知识,但是很容易犯错。所以睁大我们的眼睛,屏住我们的呼吸,小心的检查吧!
 
案例1
if not exists (select OrderID from CorpEmailSendQueue where orderid=600643425)
begin
    exec sp3_CorpEmailSendQueue_i @ID=NULL,@OrderID=600643425, @OrderType='F', @EmailType='-2',@ResendTime=0,@SendTime=NULL,@CurrentStatus='u',@GenerateTime=NULL
end

上面这个是最终正确的写法,看上去很简单吧,但是有些地方是容易犯错的。

 

错误1

if not exists select count(1) from CorpEmailSendQueue where orderid=600643425
begin
    exec sp3_CorpEmailSendQueue_i @ID=NULL,@OrderID=600643425, @OrderType='F', @EmailType='-2',@ResendTime=0,@SendTime=NULL,@CurrentStatus='u',@GenerateTime=NULL
end

看上去没问题吧,但是就会报错,错误提示如下:

Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'select'. 需要使用园括号把select count(1) from CorpEmailSendQueue where orderid=600643425包起来。

 

错误2

if not exists (select count(1) from CorpEmailSendQueue where orderid=600643425)
begin
    exec sp3_CorpEmailSendQueue_i @ID=NULL,@OrderID=600643425, @OrderType='F', @EmailType='-2',@ResendTime=0,@SendTime=NULL,@CurrentStatus='u',@GenerateTime=NULL
end

看上去也没有问题吧,但是把OrderID换成count(1)之后exists就不起作用了,select count(1) from CorpEmailSendQueue where orderid=600643425 在任何情况下都是有值的,我的意思是即使是0也是exists的,所以任何情况下都不会执行下面的存储过程。

案例2

select datediff(hh,'2013-11-21 16:50','2013-11-21 17:35') 这个得到的结果居然是1,我再想sql server是不是抽风了,这两个时间之间相差45分钟,还不到1小时,无奈只能使用select datediff(mi,'2013-11-21 16:50','2013-11-21 17:35')得到的结果是45。

还有个小知识,如果要得到当前时间可以用getdate(),如果是utc时间呢,就是当前时间减8,可以使用getutcdate()。

 

 

 

 

 

 

 

 

 

时间: 2024-10-27 02:22:16

SQL点滴29—错误无处不在的相关文章

SQL点滴6—“微软不认识闰年2月29日”&字符"N"的作用

原文:SQL点滴6-"微软不认识闰年2月29日"&字符"N"的作用 http://www.cnbeta.com/articles/50580.htm这个网页新闻中报告许多微软软件不能识别闰年的2月29号 ,其中就包含SQL Server 2008,本人就在自己的SQL Server 2008中写了几个语句试验,这几个语句显示能得到2月29号这一天,不知道照这则新闻所说在这一天安装软件会不会导致错误. select DATEADD(DD,1,'28/Feb/2

sql点滴37—mysql中的错误Data too long for column '' at row 1

原文:sql点滴37-mysql中的错误Data too long for column '' at row 1   1.MYSQL服务 我的电脑--(右键)管理--服务与应用程序--服务--MYSQL--开启(停止.重启动)   2.命令行方式 Windows 1.点击"开始"->"运行"(快捷键Win+R). 2.启动:输入 net stop mysql 3.停止:输入 net start mysql 提示* Redhat Linux 也支持service

SQL点滴7—使用SQL Server的attach功能出现错误及解决方法

原文:SQL点滴7-使用SQL Server的attach功能出现错误及解决方法 今天用SQL Server 2008的attach功能附加一个数据库,出了点问题,提示的错误是: Unable to open physical file "D:\Documents\Dalt\XXXX.mdf" Operating system error 5: "5(error not found)" (Microsoft SQL Server: Error 5120)"

SQL点滴10—使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比

原文:SQL点滴10-使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比  今天偶尔看到sql中也有with关键字,好歹也写了几年的sql语句,居然第一次接触,无知啊.看了一位博主的文章,自己添加了一些内容,做了简单的总结,这个语句还是第一次见到,学习了.我从简单到复杂地写,希望高手们不要见笑.下面的sql语句设计到三个表,表的内容我用txt文件复制进去,这里不妨使用上一个随笔介绍的建立端到端的package的方法将这些表导入到数据库中,具体的就不说了. 从这里下载文件emplo

sql点滴40—mysql乱码问题总结

原文:sql点滴40-mysql乱码问题总结 本文将为大家讲解如何处理Java连接过程中的MySQL中文乱码问题.一般MySQL中文乱码问题都是与字符集有关,这里作者的经历也大致差不多. MySQL默认编码是latin1 1. mysql> show variables like 'character%'; 2. +--------------------------+--------------------------+ 3. | Variable_name | Value | 4. +---

SQL点滴25—T-SQL面试语句,练练手

原文:SQL点滴25-T-SQL面试语句,练练手 1. 用一条SQL语句查询出每门课都大于80分的学生姓名  name   kecheng    fenshu 张三     语文     81张三     数学     75李四     语文     76李四     数学     90王五     语文     81王五     数学     100王五     英语     90 思路:这里不能直接用分数>80这样的比较条件来查询的到结果,因为要求没门成绩都大于80.我们可以反过来思考,如果

SQL点滴22—性能优化没有那么神秘

原文:SQL点滴22-性能优化没有那么神秘 经常听说SQL Server最难的部分是性能优化,不禁让人感到优化这个工作很神秘,这种事情只有高手才能做.很早的时候我在网上看到一位高手写的博客,介绍了SQL优化的问题,从这些内容来看,优化并不都是一些很复杂的问题,掌握了基本的知识之后也可以尝试优化自己的SQL程序,甚至是其他相关的程序.优化是一些工作积累之后的经验总结和代码意识,只要平时注意积累,你也可以做优化的工作.这一篇随笔是转载,不过我强烈推荐给所有对数据库优化有兴趣的博友,读了这一篇之后下一

SQL点滴20—T-SQL中的排名函数

原文:SQL点滴20-T-SQL中的排名函数   提到排名函数我们首先可能想到的是order by,这个是排序,不是排名,排名需要在前面加个名次序号的,order by是没有这个功能的.还可能会想到identity(1,1),它也给了一个序号,但是不能保证给出的序号是连续升序的.除非能够保证所有的Insert语句都能够正确成功地完成,并且没有删除操作,实际的使用中大多数的表都不能保证这样. 好在SQL Server中提供了一些排名函数来辅助实现这些功能.排名函数按照需要的顺序对数据进行排名,并提

SQL点滴9—SQL Server中的事务处理以及SSIS中的内建事务

原文:SQL点滴9-SQL Server中的事务处理以及SSIS中的内建事务 我们可以把SSIS中的整个package包含在一个事务中,但是如果在package的执行过程中有一个表需要锁定应该怎么处理呢?SSIS内建的事务处理可以解决这个问题.在此之前首先来熟悉一下SQL Server中的事务的概念.   事务 SQL Server中的事务是单个的工作单元.如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中永久的组成部分.如果事务遇到错误且必须取消或回滚,则所有的数据修改均被