在转换列上进行过滤时,t-sql视图转换失败

时间:2015-08-27 11:41:20

标签: sql-server

我试图通过过滤一些表来创建视图,并将一些转换为不同类型列的列包含到选择列表中。视图过滤器从结果集行中排除,此行无法转换为该类型。然后我从此视图中选择行并使用此转换列过滤行。我总是收到错误Conversion failed when converting the nvarchar value '2aaa' to data type int

http://docs.fabfile.org/en/1.10/usage/execution.html#roles

MS SQL Server 2008架构设置

create table _tmp_aaa (id int identity(1, 1), value nvarchar(max) not null)
go
insert _tmp_aaa (value) values ('1111'), ('11'), ('2aaa')
go

create view _tmp_v_aaa 
as 
select id, cast(value as int) as value from _tmp_aaa where value like '1%'
go

查询1

select * from _tmp_v_aaa where value = 11

有没有解决方法?

3 个答案:

答案 0 :(得分:3)

添加到您的视图ISNUMERIC以检查字符串是否为数值:

0

答案 1 :(得分:2)

我尝试了一些技巧......显然,优化器试图将你尚未转型的标准放在哪里。这是一个需要解决的问题。多语句功能。他们最大的缺点是在这种情况下的优势:优化器不会调查它,而只是“按原样”获取结果:

create function  fn_tmp_v_aaa()
returns @tbl table(id INT, value INT)
as 
BEGIN
INSERT INTO @tbl
select id, cast(value as int) as value from _tmp_aaa where value like '1%'
RETURN;
END

select * from dbo.fn_tmp_v_aaa() where value=11;

答案 2 :(得分:2)

如果查看执行计划,谓词会传递给表格,如....

enter image description here

您的查询会被翻译成.....

grep -c -r 'word' . | awk -F: '$2 > 10 { print $1 }'

现在,如果您运行此查询,则会在查询视图时遇到相同的错误。

select id, cast(value as int) as value 
from tmp_aaa 
where CONVERT(INT, value,0) like '1%'
 AND CONVERT(INT, value,0) = CONVERT(INT, 11,0)

当转换谓词Conversion failed when converting the nvarchar value '2aaa' to data type int. 时,表达式的一侧有CONVERT(INT, value,0) like '1%'而另一侧有varchar,INT是优先级较高,sql server尝试将整个表达式转换为INT而失败因此错误消息。