これはかなり簡単です。以下のコードで以下のエラーが発生するのはなぜですか?
declare @dTest decimal(10, 9)
set @dTest = 50
エラー:
Msg 8115, Level 16, State 8, Line 3
Arithmetic overflow error converting int to data type numeric.
のMSDNドキュメントによるとdecimal(p, s)
、 (または私の場合は10)は「小数点の左側と右側の両方にp
格納できる10進数の最大合計数」ですが、(または私の場合は9)は「小数点の右側に格納できる小数点以下の最大桁数」。s
私の番号 50 は、合計 2 桁 (最大10 未満) しかなく、小数点以下 0 桁 (最大9未満) であるため、機能するはずです。
本質的に同じ問題に関するこの質問を見つけましたが、ドキュメントが動作と競合しているように見える理由を誰も説明しませんでした。次元は実際には小数点の右側の固定桁数s
として解釈され、 p番号から差し引かれているようです。私の場合、左側を処理するために 10 - 9 = 1 桁しか残っていません。
動作に一致するように書かれたドキュメントを解釈する合理的な方法を誰かが提供できますか?
編集:
以下にいくつかの説明がありますが、ドキュメントの文言に関する根本的な問題に対処していません。文言を次のように変更することをお勧めします。
「p (精度)」の「格納できる 10 進数の最大総数」を「格納される 10 進数の最大総数」に変更します。
そして、「s(位取り)」については「小数点以下に格納できる小数点以下の最大桁数」を変更します。「小数点の右側に格納される 10 進数の桁数。この数値を p から減算して、小数点の左側の最大桁数を決定します。」
誰かがより良い説明を持っていない限り、Connect にバグ レポートを提出するつもりです。