日期:2014-05-17  浏览次数:20461 次

声明一个时间变量与使用
 declare @datefrom datetime;
       set @datefrom='2014-01-03 09:00:00';          
       select * from rpt_qc_detail2 with (nolock) where COL_TIME > @datefrom;
       
       select * from rpt_qc_detail2 with (nolock) where COL_TIME > '2014-01-03 09:00:00';


上面一个执行后,竟然出不来结果,
后面一个正常,难道两个有区别?

谢谢啦,新手问题多多哦

------解决方案--------------------
请问rpt_qc_detail2表COL_TIME列的数据类型是什么?
------解决方案--------------------
这两个语句:

select * from rpt_qc_detail2 with (nolock) where COL_TIME > @datefrom;
        
       select * from rpt_qc_detail2 with (nolock) where COL_TIME > '2014-01-03 09:00:00';

应该是因为col_time是varchar类型的把,不然不太可能出现这种问题的:

select * from rpt_qc_detail2 with (nolock) where COL_TIME > convert(varchar(30),@datefrom,120);
        
       select * from rpt_qc_detail2 with (nolock) where COL_TIME > '2014-01-03 09:00:00';
------解决方案--------------------
我的理解
1.用变量的时候,查询分析器不知道变量的值是什么,所以预估的条数会很大,所以走全表扫描。
2.直接用某个值的时候,查询分析器能比较准确的预估结果的条数,所以在预估结果很少的情况下会走索引。

对于用变量的方式,如果你把语句放到存储过程里面应该就可以用到索引了,存储过程中会根据你传入的变量的值来选择走索引和全表扫描。但是这个存储过程中的执行计划是存储了的,所以后面再执行这个存储过程的时候,还是走第一次的执行计划。如果由于你变量的值发生变化,用表扫描效率更高,但是存储过程依然会沿用旧的执行计划,继续走索引。
------解决方案--------------------
可以,用with关键字