【问题标题】:Error converting Varchar to Decimal SQL Server将 Varchar 转换为十进制 SQL Server 时出错
【发布时间】:2016-03-25 18:37:20
【问题描述】:

我有一个暂存表,其中加载了来自 SAS 数据集的数据,该数据集包含 5M 条记录。所有列都是varchar。我正在尝试将几列转换为decimal(32,10)。但它会产生错误。我尝试了强制转换,我尝试了转换,甚至在小数点前后拆分数据 - 结果相同。

我查看了该列的 IsNumeric 标志,有 0 条记录 1 表示数据是数字。

case 
   when wtd_count = '.' THEN NULL
   when wtd_count = '' THEN NULL
   else convert(decimal(32, 10), wtd_count) 
end

错误:

消息 8114,第 16 级,状态 5,第 99 行
将数据类型 varchar 转换为数值时出错。

所以我想知道我还能做些什么来将数据转换为十进制?任何想法? 任何帮助将不胜感激。

【问题讨论】:

  • 必须是十进制吗? Val或Long怎么样?我假设您希望该值是一个数字?
  • 您显然在该表中至少有一个值无法转换为小数。如果您使用的是 2012 年或更新版本,请查看 TRY_PARSE (msdn.microsoft.com/en-us/library/hh213126.aspx)。
  • 感谢您的回复@Sean Lange。无法使用 Try_Parse,因为我在 Sql server 11.0.x 上。
  • 感谢您回复@Leptonator。转换为数字 (32,10) 有效。只是不要小数(32,10)。不知道为什么会这样。
  • 您可以尝试通过游标运行数据,以便逐条记录,或者尝试将其批量处理成一千条记录,以便找出导致问题的特定数据。以下语句在 SQL 2014 中运行,因此它是有效的精度和小数位数。 SELECT CAST('7.2' AS DECIMAL(32,10))

标签: sql-server


【解决方案1】:

如果您使用的是 SQL Server 2012 及更高版本,请尝试使用 try_parse 或 try_convert

【讨论】:

    【解决方案2】:

    ISNUMERIC 对于您正在做的事情并不可靠。它会将带有货币符号和逗号之类的值标记为有效。

    似乎很可能存在一些非数字数据。 TRY_CONVERTTRY_PARSE 是你的朋友。仅供参考,SQL Server 版本 11.0.x 是 SQL Server 2012,因此您应该能够使用这些。

    我也很难相信转换为数字有效,但不是十进制。我找不到任何信息表明这两种数据类型的实际实现不同,因此两者都不应该起作用。

    我会对你的数据做一些更深入的分析,以确保它看起来像你所期望的那样。

    【讨论】:

      【解决方案3】:

      阅读您的案例陈述后,我想您有逗号分隔的值。我很确定你应该使用:CONVERT(DECIMAL(32,10),REPLACE(wtd_count,',','.'))

      【讨论】:

        猜你喜欢
        • 2013-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多