运行此查询时:
create table #test (field varchar(100))
insert into #test (field) values ('this is not a number')
insert into #test (field) values ('1234567')
select *
from ( select field
from #test
where ISNUMERIC(field) = 1
) as subquery
where CAST(field as int) > 100
drop table #test
我期望返回1234567,但实际上却得到了如下结果:
Msg 245, Level 16, State 1, Line 7
Conversion failed when converting the varchar value 'this is not a number' to data type int.
这就像内部查询没有首先执行,而查询优化器对我尝试做什么进行了(不正确的)假设。我不得不使用临时表来解决这个问题:
create table #test (field varchar(100))
insert into #test (field) values ('this is not a number')
insert into #test (field) values ('1234567')
select field
into #subquery
from #test
where ISNUMERIC(field) = 1
select *
from #subquery
where CAST(field as int) > 100
drop table #subquery
drop table #test
这是SQL查询优化器的一个bug吗?有人能给我解释一下吗?
编辑:针对这个问题是重复的回答...我没有使用'IN'语句。我写的逻辑意味着我需要在应用CAST条件之前返回一个经过过滤的子查询。任何理智的人都会期望我的查询以这种方式运行。优化器版本的查询显然不是逻辑上相同的。
IsNumeric()
在使用上是出了名的有问题。 - HABO