获取'将数据类型varchar转换为数字时出错'。

时间:2013-01-28 16:57:37

标签: sql-server sql-server-2008 sql-server-2005

我有一个名为testTable的表,其中有两列,id,自动递增,someValue

someValue列中包含的数据为:12, 1.2, .4, 1d4, +, -, .

someValue的数据类型为varchar(50)

为什么以下查询会抛出

  

将数据类型varchar转换为数字时出错。

select ID, someValue 
from testTable 
where ISNUMERIC(someValue + 'd0') = 1 and CAST(someValue as decimal(8,2)) > 0.1;

select tt.ID,tt.someValue 
from (select ID, someValue 
      from testTable 
      where ISNUMERIC(someValue + 'd0') = 1) as tt 
where CAST(tt.someValue as decimal(8,2)) > 0.1;

2 个答案:

答案 0 :(得分:1)

你有一些问题; CAST不适用于非十进制输入,ISNUMERIC接受可转换为金额的字符串,包括非小数值,如“ - ”,“。”或“US $ 100”。< / p>

解决此问题的正确方法是向数据库中添加Decimal列,填充someValue以填充Decimal列,并使用您要比较的值,以及仅与Decimal列进行比较。

如果由于某种原因,您无法执行此操作,则可以使用ISNUMERIC并仅包含非货币小数,并使用Convert代替CAST

select ID, someValue 
from testTable 
where ID IN
    (select ID from testTable where ISNUMERIC(someValue) = 1
    AND Patindex('%[^0-9-+.]%', someValue) = 0
    AND someValue NOT IN ('-', '+', '.')
    )
    and Convert(decimal, someValue) > 0.1

答案 1 :(得分:0)

在您的第一个声明中,您直接从testTable开始尝试:

CAST(someValue as  decimal(8,2))

由于您没有过滤掉非数值,因此会抛出错误。