2012-03-07 9 views
4

SQL Server 2008データベースに小数点以下の数値を挿入する必要があります。 decimal()が正しいデータ型であると思われますが、正確に理解するのが難しいです。SQL Server 2008 - 10進数の理解に問題がある

私は、このスクリプト(小数点以下のため、下にスクロール)が見つかりました:

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=95322

私は数字に対して異なる小数の設定をテストすることができます、そして、彼らは合格か不合格理由を私は理解していないいくつかがあります。 decimal(precision、scale)を使用するとき、私が理解する方法は、precisionは小数点の左側の桁数で、scaleは小数点以下の桁数です。この関数を使用すると、私はなぜいくつかが渡している理由といくつかが失敗している理由を理解していません。

SELECT dbo.udfIsValidDECIMAL('2511.1', 6, 3)  

私は左に4桁、右に1桁ありますが、これは失敗します。

SELECT dbo.udfIsValidDECIMAL('10.123456789123456789', 18, 17)  
SELECT dbo.udfIsValidDECIMAL('10.123456789123456789', 18, 16) 

最初のものが失敗し、2番目のものが失敗します。小数点の後ろに18桁の数字があるので、両方が失敗する(または合格して、SQLは数字を切り捨てる)ようです。

おそらく、私はdecimal()がうまくいくことに根本的な誤解がありますか?

答えて

2

精度は合計で格納できる桁数です。

したがって、小数点の左側の数字は精密スケールになります。例えば

、あなただけの、小数点の左側に3桁を可能にしているので、あなたの最初の例は失敗します。

SELECT dbo.udfIsValidDECIMAL('2511.1',6,3) 
1
cast(10.123456789123456789 as decimal(18,17)) 

17の18 &スケールの精度はわずか1桁にすることができます小数点以下は左になりますが、その例では2つです。

cast(10.123456789123456789 as decimal(18,16) 

2桁の空白があります。

+0

小数点の左側に桁数を得るには、精度から位取りを引く必要がありますか? – Pryach

4

DECIMAL(6,3)は、すべてが6桁で、小数点以下3桁です。

だから、前に小数点以下3桁の数字を3桁の数字を持って、そしてもちろん、それは2511.1を扱うことができません - それは、小数点の左側に桁の数字を持っています。それを処理するにはDECIMAL(7,3)が必要です。

MSDN documentation on DECIMAL参照:

小数[(P [S])]と数字[(P [S])]

P(精度)

小数点の左と右の両方に格納できる最大の小数点以下の桁数はです。 の精度は、1から最大精度38までの値でなければなりません。 デフォルトの精度は18

S(スケール)

小数点の右側に格納できる桁の最大数です。スケールは、0〜pの値でなければなりません。 精度は指定されている場合のみスケールを指定できます。デフォルトの は0です。したがって、0 < = s < = p。最大ストレージサイズは、精度で に基づいて異なります。

関連する問題