【发布时间】:2016-09-16 19:14:19
【问题描述】:
我有一个值为 0.987878656435798654 、 0.765656787898767 的字段成本
我正在试图弄清楚这将是什么数据类型。
当我给 decimal 15,15 并尝试加载数据时,它会抛出一个错误
将 varchar 转换为数字数据类型时出现算术溢出错误。
【问题讨论】:
标签: sql sql-server-2008
我有一个值为 0.987878656435798654 、 0.765656787898767 的字段成本
我正在试图弄清楚这将是什么数据类型。
当我给 decimal 15,15 并尝试加载数据时,它会抛出一个错误
将 varchar 转换为数字数据类型时出现算术溢出错误。
【问题讨论】:
标签: sql sql-server-2008
问题是您没有为小数点之前 的值分配任何长度。
DECIMAL (15, 15) 表示它具有小数点后 15 位的精度,但总共只有 15 位的空间 - 因此没有空间容纳大于 1 的值。
这意味着DECIMAL (15, 15) 仅支持以下范围内的值:
-0.999999999999999 到 0.999999999999999(小数点后 15 位)。
您的第一个示例中有 18 数字,所以我建议使用 DECIMAL (21, 18) 之类的数字
DECIMAL (21, 18) 支持的值范围为:-999.999999999999999999 到 999.999999999999999999(小数点后 18 位)。
但是,您应该分析自己的数据,看看您需要支持的最大值是多少。
【讨论】:
DECIMAL(28,25) (例如),使用相同数量的存储字节获得更高的精度(来源:msdn.microsoft.com/en-us/library/ms187746.aspx)。您可能还想考虑使用货币类型:msdn.microsoft.com/en-us/library/ms179882.aspx,尽管它最多只有 4 位十进制数字(通常对于货币来说绰绰有余,也许不是您的情况)。
试试这个...
SELECT LEN(YourColumn)
FROM YourTable
那么,如果每次都低于1,试试这个……
SELECT CONVERT(DECIMAL(X,X-1),YourColumn)
其中 X 是 LEN 语句中返回的内容。 X-1 比那个小一。
请记住,它是DECIMAL(TotalLength,Precision),因此您需要确保有足够的空间容纳总值。
【讨论】: