【问题标题】:'Converting varchar to data type numeric' error after successful conversion to decimal(18,2)成功转换为十进制 (18,2) 后出现“将 varchar 转换为数据类型数字”错误
【发布时间】:2012-05-06 17:56:38
【问题描述】:

我有一个用于解析的临时表#rp。

#rp 包含一个nvarchar(max) 列#rp.col8,它将正数和负数保存到小数点后两位,例如`1234.26'。

我能够运行以下查询并得到一组转换后的值:

select * from
(
    select CONVERT(decimal(18,2),rp.col8) as PARSEAMT
    from #rp

    where
    --#rp filtering criteria
)q  

但是,当我尝试以下列方式查询 PARSEAMT = 0 时,我得到标准的“8114,将数据类型 varchar 转换为数字时出错。”:

select * from
(
    select CONVERT(decimal(18,2),col8) as PARSEAMT
    from #rp

    where
    --#rp filtering criteria
)q  
where q.PARSEAMT = 0

没有where 子句,查询运行良好并生成预期值。

我也尝试过其他子句,例如 where q.PARSEAMT = 0.00 和 where q.PARSEAMT = convert(decimal(18,2),0)。

我在比较中做错了什么?

【问题讨论】:

  • SELECT MAX(PARSEAMT), MIN(PARSEAMT) 产生什么?
  • Aaron : MAX() 返回 328.90,MIN() 返回 -111.46
  • 好吧,我无法重现这个问题,所以一定有一些因素没有在问题中显示出来。你能显示 CREATE TABLE #rp 吗?您确定 col8 中的所有值都是有效的十进制值吗?如果是这样,为什么列 nvarchar(max) 而不是首先使用正确的数据类型?
  • #RP 是一个包含 50 个 NVARCHAR(MAX) 列的表;它本质上是我构建的东西,在我将它们上传到更理智的东西之前,将它们保存在一种实体属性值表中。我刚刚检查了一些正则表达式,我很确定它们都适合有效的十进制格式。奇怪的是我可以使用子查询将它们转换为有效的数字(18,2)值......但是当我尝试比较转换后的值时,它会产生转换错误。
  • 如果没有更简单的重现和示例数据来重现问题,您将很难让其他人为您破译问题。

标签: sql-server sql-server-2008 type-conversion


【解决方案1】:

我本来建议您将 PARSEAMT 选择到另一个临时表/表变量中,但我可以看到您已经从您的 cmets 中这样做了。

出于兴趣,下面的结果是什么?

select 
    col8
from
    #rp
where
    -- ISNUMERIC returns 1 when the input expression evaluates to a valid 
    -- numeric data type; otherwise it returns 0. Valid numeric data types 
    -- include the following:
    isnumeric(col8) <> 1 

【讨论】:

  • 我很确定我之前对该列进行了 ISNUMERIC() 检查,结果很清楚。我明天起床再跑一次。
  • 在我考虑我之前的条件后,您的查询返回零结果。请记住,只要输入可以转换为 -any- 数字类型,ISNUMERIC() 将返回 1,无论它是否是您最终尝试使用的类型。
猜你喜欢
  • 2013-04-27
  • 2015-05-11
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多