我试图通过过滤一些表来创建视图,并将一些转换为不同类型列的列包含到选择列表中。视图过滤器从结果集行中排除,此行无法转换为该类型。然后我从此视图中选择行并使用此转换列过滤行。我总是收到错误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
有没有解决方法?
答案 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)
如果查看执行计划,谓词会传递给表格,如....
您的查询会被翻译成.....
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而失败因此错误消息。