我有以下语句在一个非常大的存储过程结束时执行。
UPDATE myTable
SET DiffPerc = CAST(CASE
WHEN ( CASE
WHEN SimExt = 0
AND StdExt = 0 THEN 0
WHEN StdExt = 0 THEN 99999
ELSE SimExt - StdExt / StdExt
END ) * 100 > 99999 THEN 99999
ELSE ( CASE
WHEN SimExt = 0
AND StdExt = 0 THEN 0
WHEN StdExt = 0 THEN 99999
ELSE SimExt - StdExt / StdExt
END ) * 100
END AS DECIMAL(8, 2))
这个想法是我有一个字段来确定一个值与另一个值的百分比差异。该字段是toDiffPerc
的百分比差异。这个例程每天都有效,已经一年多了,但是,从两天前开始,我开始收到以下错误消息:SimExt
StdExt
将数字转换为数字数据类型的算术溢出错误。
我理解这条消息的含义,但嵌入 case 语句的全部意义在于测试分母中的 0,以及在将值打包到DECIMAL (8, 2)
字段中之前检查任何非常高的值百分比。
我错过了什么?如何更新此语句以解决所有可能的边缘情况并在溢出发生之前处理它?
另外,请注意,99999
以百分比形式的硬编码值是向最终用户表明有人搞砸了的标志。