【问题标题】:What cause the error 'Arithmetic overflow error converting varchar to data type numeric'?是什么导致错误“将 varchar 转换为数据类型数字的算术溢出错误”?
【发布时间】:2016-10-11 01:17:58
【问题描述】:

我使用下面的查询将 varchar(255) 的“Characteristic__c”列转换为 DECIMAL(22,8)。 Characteristic__c 的值被指定为简单的 0.0,但它仍然会导致错误“将 varchar 转换为数据类型数字的算术溢出错误。”。不知道原因,谢谢帮助。

SELECT CONVERT(DECIMAL(22,8) , Characteristic__c) FROM  [ODS].[dbo].
[Scorecard_Details__c]
WHERE Attribute__c='Employment Duration' and Characteristic__c=0.0 and 
WOE__c=0

【问题讨论】:

  • varchar(255) 必须太宽,无法放入 decimal(22, 8)。仅仅因为给定的 0.0 并不意味着它占用的空间反映了该数量。
  • 我相信问题出在 WHERE 子句上。你会得到同样的错误:select 1 from (values('1')) t(a) where t.a = 0.0;。修复可能取决于您的数据是什么样的。
  • TBH 你的列名看起来很难看

标签: sql-server


【解决方案1】:

据推测,Characteristic_c 无法转换为数字。在 SQL Server 2012+ 中,您可以简单地使用TRY_CONVERT()

SELECT TRY_CONVERT(DECIMAL(22, 8) , Characteristic__c)
FROM [ODS].[dbo].[Scorecard_Details__c]
WHERE Attribute__c = 'Employment Duration' AND
      TRY_CONVERT(DECIMAL(22, 8), Characteristic__c) = 0.0 AND 
      WOE__c = 0;

注意:如果WOE__c是一个字符列,你也应该在那里使用TRY_CONVERT()

【讨论】:

    【解决方案2】:

    看起来 varchar 中的数字比十进制 (22) 长。我的意思是一个数字太高而无法以十进制存储。检查您的数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      相关资源
      最近更新 更多