2014-01-11 62 views
0

任何人都可以解释查询在放置在视图中后的功能不同吗?更具体地说,我已经注意到,当我运行视图时,我经常会遇到数据类型转换错误,但是当我在视图内部运行隔离查询时不会。例如:SQL - 运行视图时出错,但在视图内运行查询时出错

select 
cast(id as int(11)) as 'UserID', 
name, 
dob 
from myTable 

该查询运行得很好。然而,当我保存这个查询作为视图:

create view myView as (
select 
cast(id as int(11)) as 'UserID', 
name, 
dob 
from myTable 
) 

,然后尝试和select * from myView运行来看,很多时候,我会得到转换错误,如“算术溢出的数据类型为varchar转换为数字”。有人可以解释当查询存储为导致此错误的视图时,对查询所做的更改吗?

+0

这取决于你的数据,可能你的数据有空间,点或其他东西,不能转换为int。 –

+0

什么版本的SQL Server确实允许int(11)的数据类型? 也许你使用MySQL。 – msi77

回答

1

这可能与正在返回的数据的顺序有关。如果您返回全部行,您的常规查询可能会遇到错误。你在id中显然有不良的价值。解决这个问题的方法是:

select (case when isnumeric(id) and id not like '%.%' then cast(id as int(11)) end) as UserID, 
     name, 
     dob 
from myTable; 

“正确”的方式当然是将数字数据存储为数字而不是字符串。

+1

+1使用**适当的数据类型** - 总是。 –

+0

不幸的是,我正在处理继承的数据库,我不能改变结构。我只是不明白当我运行它时,查询是如何工作的非常好,但只要我创建视图,视图就会遇到数据类型转换错误。 – gtallen1187