我需要将带小数的数字插入SQL Server 2008数据库。似乎decimal()是要使用的正确数据类型,但是,我无法完全理解它。
我找到了这个脚本(向下滚动到十进制):
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=95322
这允许我针对数字测试不同的小数设置,并且有一些我不明白为什么它们通过或失败。我理解它的方式,当使用十进制(精度,标度)时,精度是小数点左边的位数,scale是小数点右边的位数。使用这个函数,我不明白为什么有些人正在传递,为什么有些人失败了。
SELECT dbo.udfIsValidDECIMAL('2511.1', 6, 3)
我左边有4个数字,右边有1个数字,但是这个数字失败了。
SELECT dbo.udfIsValidDECIMAL('10.123456789123456789', 18, 17)
SELECT dbo.udfIsValidDECIMAL('10.123456789123456789', 18, 16)
第一个失败,第二个失败。小数点后面有18位数字,所以看起来两者都应该失败(或传递和SQL截断数字)。
也许我对decimal()的工作原理有一个基本的误解?
答案 0 :(得分: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。最大存储大小因基础而异 关于精度。
答案 1 :(得分:2)
精确度是指总共可以存储的位数。
因此,小数点左边的数字将是精度 - 比例。
例如,您的第一个示例将失败,因为您只允许小数点左边的三个位置:
SELECT dbo.udfIsValidDECIMAL('2511.1',6,3)
答案 2 :(得分:1)
cast(10.123456789123456789 as decimal(18,17))
精度为18&amp;等级17允许小数点左边只有1位数,但在这个例子中有2位。
cast(10.123456789123456789 as decimal(18,16)
有2位数的空间,所以成功。