2017-08-02 5 views
1

SQL Serverでは、なぜ12538335.3は10進数ではないのですか(10,4)?それもdecimal(11, 4)ではありませんが、decimal(12, 4)です。SQL Serverでは、なぜ12538335.3は小数点以下(10,4)ではありませんか?

12,4

CREATE TABLE T (d decimal(10, 4) NOT NULL) 

INSERT INTO T (d) 
VALUES (12538335.3) 
-- Arithmetic overflow error converting numeric to data type numeric. 

ALTER TABLE T ALTER COLUMN d decimal(11, 4) 

INSERT INTO T (d) 
VALUES (12538335.3) 
-- Arithmetic overflow error converting numeric to data type numeric. 

ALTER TABLE T ALTER COLUMN d decimal(12, 4) 

INSERT INTO T (d) 
VALUES (12538335.3) 
-- OK 
+0

あなたは '.3'の右側に3つのゼロを数えていないので。 'Decimal(10,4)'は**常に** int部分の最大(10-4)桁と小数部分の4桁を意味します。この場合、 '12538335'は8桁で、6桁ではありません。 – Lamak

+1

**ドキュメント**(https://docs.microsoft。com/en-us/sql/t-sql/data-types/decimal-and-numeric-transact-sql)を参照すると、2つの数字は**合計**桁数(10)を意味します。カンマ(4)の後の桁数。したがって、10進数(10,4)は、10桁**合計**を意味します。そのうち小数点以下4桁です(従って、小数点以下6桁)。あなたの数字はあなたのデータ型に合う** **大きすぎます! –

+1

12,538,335.3この数字に9桁の有効数字があります。そのうちの1つは10進数です。だから9,1は動作します。あなたの小数点以下の桁数が4桁でない理由は、その左側に6個しかありません。小数点の左にある8つの数字が「あふれない」ことを意味します。 99,999,999.9999を保存する必要がある場合は、左に(12,4)8桁、右に合計4を設定する必要があります。 – xQbert

答えて

3

精度とスケール...小数点の右側に4と12件の総桁です。 12538335.3は9桁ですが、decimal(12,4)で定義されている尺度の余分な0を占めている場合は、合計12桁の12538335.3000が得られます。したがって、このシナリオは機能します。

11.4は正しく動作しません。なぜなら、11(精度)の桁では、宣言した尺度(4)の最後に余分な0があるからです。

これは10,4

declare @var decimal (12,4) 
set @var = 12538335.3 
select @var 
--returns 
12538335.3000 
0

誤解が桁の語句総数から生じるについても同様です。

スケールを埋めるために右にゼロが埋め込まれた後の桁数の合計を意味します。

0

[1]

[...]なぜ12538335.3(10、4)小数ではありませんか?小数点(11,4) でも小数点(12,4)です。

さて、SQL_VARIANT_PROPERTYによれば、それは(9、1)数値は次のとおり

SELECT SQL_VARIANT_PROPERTY(12538335.3, 'BaseType') AS DataType, 
    SQL_VARIANT_PROPERTY(12538335.3, 'Precision') AS [Precision], 
    SQL_VARIANT_PROPERTY(12538335.3, 'Scale') AS [Scale] 
/* 
DataType Precision Scale 
-------- --------- ----- 
numeric 9   1  
*/ 

ここ

  • 9 =総桁数(小数点+右 側の左側)
  • 1 =セパレータ後の桁数。このデータ型の

は、最大値は、コード

CREATE TABLE T (d decimal(10, 4) NOT NULL) 

INSERT INTO T (d) 
VALUES (12538335.3) 

の999,999,999.9

[2]以下ピースある12538335.3/NUMERIC(9,1)8digits . 1digitNUMERIC(10,4)6digits . 4digits)に挿入しようとしています。ターゲット・データ・タイプ/数字は(10,4)のみINSERTステートメントの上方(12538335.3に必要な8桁の数字と比較して)小数点の左側ため6digitsたため例外を生成する:

Arithmetic overflow error converting numeric to data type numeric. 

基本的

を意味します
Arithmetic overflow error converting numeric(9,1) to data type numeric(10,4). 
関連する問題