非常に大きなストアドプロシージャの最後に実行される次のステートメントがあります。
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))
アイデアは、ある値と別の値のパーセンテージの差を決定するフィールドがあるということです。フィールドDiffPerc
は〜のパーセント差SimExt
ですStdExt
。このルーチンは1年以上もの間毎日機能していますが、2日前から、次のエラーメッセージが表示されるようになりました。
数値をデータ型数値に変換する際の算術オーバーフローエラー。
DECIMAL (8, 2)
このメッセージの意味は理解できますが、埋め込まれたcaseステートメントの要点は、分母の0をテストすることと、値がフィールドにパックされる前に非常に高い値のパーセンテージをチェックすることの両方です。
私は何が欠けていますか?このステートメントを更新して、考えられるすべてのエッジケースを考慮し、オーバーフローが発生する前に処理するにはどうすればよいですか?
99999
また、パーセントとしてハードコードされた値は、誰かが何かを台無しにしたことをエンドユーザーに示すフラグであることに注意してください。