SQL Server十进制标度长度 - 可以是或必须是?

时间:2013-04-05 19:53:24

标签: sql-server decimal scale precision

我真的只是在SQL Server 2008 R2中询问DECIMAL(可能是NUMERIC)类型。

MSDN说:

  

(标度)   可以存储在小数点右侧的最大小数位数。比例必须是从0到p的值。

我理解以下方式:

  • 如果我有DECIMAL(10, 5) - 我可以存储12345.12345或12345678.91。
  • 如果我有DECIMAL(5, 5) - 我可以有12345或1234.5或1.2345等......

是否清楚?

但我收到此错误消息:

SELECT CAST(2.8514 AS DECIMAL(5,5))
  

将数字转换为数据类型为数字的算术溢出错误。

我认为5,5表示我最多可以有5位数字,最多5位CAN小数点右边。

我试过:

SELECT CAST(12.851 AS DECIMAL(6,5)) - overflows too

然而

SELECT CAST(1.23456 AS DECIMAL(6,5)) - is OK.

那么真相是什么?

DECIMAL(a,b)说我最多可以有一个数字,并且它们只有小数点(并且左边有a-b到dec。点)?

我真的很困惑,文档中的语句被复制到处。请花一点时间向我解释这个简单的事情。

非常感谢!

1 个答案:

答案 0 :(得分:21)

最简单的思考方式(对我而言)是精度是总位数,其中标度是小数点右边的位数。因此,DECIMAL(p,s)表示该点左侧的p-s个数字,以及该点右侧的s个数字。

这解释了您看到的所有转化错误:2.8514不能decimal(5,5),因为p-s = 0; 12.851不能decimal(6,5),因为p-s = 1等等。