【问题标题】:Arithmetic overflow - handling overflown cases算术溢出 - 处理溢出的情况
【发布时间】:2018-04-27 06:55:44
【问题描述】:

即使查看了很多线程,我也未能解决此问题。

我有一列十进制(8,4)和一个包含4个案例的数据表,这些案例是直线并超过上限。没关系。我有一个导入脚本,性能没有问题,最多可以使用 20 次。

我尝试了很多方法来处理这个问题,比如(这段代码是 SELECT 语句的一部分):

CASE WHEN PRT.InputColumn > 999 THEN 999.9999 ELSE PRT.InputColumn END as MyColumn

但显然,服务器在评估 WHEN 语句时会考虑十进制(8,4),并且无论如何都会抛出错误。好的,我认为这可能会解决问题:

CASE WHEN TRY_CONVERT(decimal(12,4), PRT.InputColumn) IS NULL THEN 999.9999 ELSE PRT.InputColumn END as MyColumn

但是,我还是遇到了同样的错误:

Arithmetic overflow error converting numeric to data type numeric.

所以我的意思是保持列数据类型不变并处理过多的值。 处理溢出值的正确方法是什么?

【问题讨论】:

  • 应该是TRY_CONVERT(decimal(8,4)) 而不是12,4。如果它是decimal(8,4),它最多可以是 9999 而不是 999。更短的语法:COALESCE(TRY_CONVERT(decimal(8,4)), 9999.9999)
  • 我从十进制(8,4)开始,但不允许过多的数字,所以我尝试扩大它;既然您指出了这一点,我认为这与 NULL 相比没有意义。我在那里有 9999,只是在它不起作用时试图降低安全界限。较短的语法是有意义的;你错过了输入变量,但我明白了:-)。我将重复几次测试,以确保我没有错过正确的语法。感谢您的建议。
  • @dnoteth:哦,真丢脸。在尝试进行测试时,我确实错过了正确的语法组合......你的两个建议都有效。如果您将其复制并粘贴到单独的答案中,我很乐意接受。谢谢。

标签: sql sql-server casting decimal overflow


【解决方案1】:

当您尝试转换为 DECIMAL(12,4) 时,您可能会得到比 9999 更大的值,当然它们不适合 DECIMAL(8,4)。

只需切换到 8,4:

CASE WHEN TRY_CONVERT(decimal(8,4), PRT.InputColumn) IS NULL 
     THEN 9999.9999 
     ELSE PRT.InputColumn
END as MyColumn

或更短:

COALESCE(TRY_CONVERT(decimal(8,4), PRT.InputColumn), 9999.9999)

注意,两者都会将较大的值转换为9999.9999

【讨论】:

    最近更新 更多