我有下表
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
任何人都可以告诉我我哪里错了
答案 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,因此可以安全地将表格中的所有行转换为数字。