算术溢出——处理溢出的情况

Arithmetic overflow - handling overflown cases

即使看了很多帖子,我也没能解决这个问题。

我有一列decimal(8,4)和一个包含4个案例的数据table,它们是行的方式并且超过了上限。没关系。我有一个导入脚本,性能没问题,最多使用 20 次。

我尝试通过多种方式处理该问题,例如(此代码是 SELECT 语句的一部分):

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

但显然,服务器在评估 WHEN 语句时以 decimal(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(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