在将varchar值'1,409.32'转换为数据类型int时转换失败

1 人关注

我在 SOP10106 表中有一个 USRDEF05 varchar(30) 列,声明为包含所有数字的列,当我试图执行以下查询时,我得到了转换错误。

Select 
    DETAIL.SUBTOTAL as Sub_Total,
when USERDEF.USRDEF05 <> ' ' THEN USERDEF.USRDEF05 
       ELSE 0
END as Winsys
    SOP10100 DETAIL
Right JOIN 
    SOP10106 USERDEF ON USERDEF.soptype = DETAIL.soptype 
WHERE 
    BACHNUMB ='WINSYS112012'

谁能给我一个主意,如何解决这个错误?

2 个评论
1,409.32 应该如何转换为int?
1,409.32不是一个int。那么sql如何将其转换为int呢?
sql
sql-server-2008
numeric
varchar
Kavitha
Kavitha
发布于 2012-12-04
4 个回答
Arvo
Arvo
发布于 2012-12-04
0 人赞同

因为你的数据库模式不正确(数字不应该作为文本存储),那么接下来不正确的语句也应该工作。

Select 
    DETAIL.SUBTOTAL as Sub_Total,
when USERDEF.USRDEF05 <> ' ' THEN USERDEF.USRDEF05 
       ELSE '0'
END as Winsys
Dis Shishkov
Dis Shishkov
发布于 2012-12-04
0 人赞同

我真的不知道你想接收什么,因为 USRDEF05 是字符串,但你似乎想让 Winsys 变成数字。

这里有几个方法。

Winsys 公司是字符串

Select 
DETAIL.SUBTOTAL as Sub_Total,
when USERDEF.USRDEF05 <> ' ' THEN USERDEF.USRDEF05 
   ELSE '0'
END as Winsys

Winsys是数字型的

Select 
DETAIL.SUBTOTAL as Sub_Total,
when USERDEF.USRDEF05 <> ' ' THEN CONVERT(MONEY, USERDEF.USRDEF05, 1)
   ELSE 0
END as Winsys
Sachin Shanbhag
Sachin Shanbhag
发布于 2012-12-04
0 人赞同

试试这个 --

CASE when ISNUMERIC(USERDEF.USRDEF05) <> 0 THEN
CAST(CAST(USERDEF.USRDEF05 as DECIMAL) as int) ELSE 0 END as Winsys

注意:- 这将把小数点后的数值四舍五入到最近的整数。

例如:如果你的值是1409.32,产生的int值就是1409。

如果你的值是1409.64,那么产生的int值是1410。

谢谢sachin的回答,USRDEF05的值不应该是四舍五入的。使用aboue quary,我得到这个错误...将数据类型varchar转换为数字时出错。
@NeeruBindela - 如果USRDEF05没有被四舍五入,那么你能解释一下如何将1409.32转换成整数值吗?另外,你是否尝试过我在你的查询中建议的 CAST
是的,我试过了,它给出的信息是。将数据类型varchar转换为数字时出错
@NeeruBindela - 你能把你的更新的查询放出来吗,我有一个测试查询,对我来说是有效的。或者你可以检查一下你的列中是否有数据实际上不是整数?只有在这种情况下,才会出现这种错误
valex
valex
发布于 2012-12-04
0 人赞同

我想问题不在这个值1,409.32上。 试着用 ISNUMERIC() 函数来运行这个查询。

Select 
    DETAIL.SUBTOTAL as Sub_Total,
when isnumeric(USERDEF.USRDEF05) = 1
THEN cast(USERDEF.USRDEF05 as decimal(12,2))
       ELSE 0
END as Winsys
    SOP10100 DETAIL
Right JOIN 
    SOP10106 USERDEF ON USERDEF.soptype = DETAIL.soptype 
WHERE 
    BACHNUMB ='WINSYS112012'