今天写了条Sql查询数据,Sql语句如下:
select DID from
(
select DID from Sys_Dictionary where dbo.fn_IsDate(left(right(DID,11),8))=1
) A
where datediff(d,cast(left(right(A.DID,11),8) as datetime),getdate()) >=0
发现所查询到的结果与自己预想的不一样。很是不解,通过测试各种不同的写法,得到的结果还是与预想的不一样。折腾了一个多小时,终于在Sql中的执行计划中找到了原因。
原来,Sql2005会根据自己的一些规则来优化我们写的Sql语句,在执行计划中可以看到,它是先进行聚集索引的描执行了datediff(d,cast(left(right(A.DID,11),8) as datetime),getdate()) >=0条件,再经过筛选器使用dbo.fn_IsDate(left(right(DID,11),8))=1来筛选,这样,经过SqlServer的优化后,以上Sql的执行顺序完全反了,得到的结查当然就是不一样了。
所以,如果我们要在Where条件中使用函数,请谨慎!