在由聚簇索引列过滤时将数据类型varchar转换为数字时出错

时间:2014-05-04 13:54:44

标签: sql-server

我有下表

create table test
(
val1 varchar(4) not null,
val2 varchar(4) not null
)

有以下行

insert into test(val1,val2) values('1111', 'A')
insert into test(val1,val2) values('1111', '50')
insert into test(val1,val2) values('1111', '50')
insert into test(val1,val2) values('2222', '50')

当我使用以下查询搜索数据时,我得到了预期的结果

select val2 from test where val2 <> 'A' and cast(val2 as numeric) > 20 and val1 = '1111'

但是当我使用以下查询创建聚集索引时

CREATE CLUSTERED INDEX [ClusteredIndex-20140504-185616] ON [dbo].[test]
(
    [val1] ASC
)

然后运行上面提到的查询,在创建聚簇索引之前给出了预期的结果,我得到了这个错误

Error converting data type varchar to numeric

任何人都可以告诉我我哪里错了

1 个答案:

答案 0 :(得分:1)

  

任何人都可以告诉我我哪里错了

您假设where子句的评估从左到右完成并且短路,因此在转换为数字之前排除val2 = 'A'的行。

SQL Server可以按照它认为合适的任何顺序评估where子句。

使您的查询工作的重写可能如下所示。

select val2 
from test 
where cast(nullif(val2, 'A') as numeric) > 20 and 
      val1 = '1111'
如果nullif

val2 = 'A'将返回null,因此可以安全地将表格中的所有行转换为数字。