SQL中的算术溢出错误

时间:2011-12-15 17:32:43

标签: sql sql-server-2008

所以,只是为了举例说明我们的程序最终如何处理数据并提出此错误,这里有一些SQL:

DECLARE @daysInPeriod  INT
DECLARE @dcFraction    DECIMAL(38,38)
DECLARE @YEAR_360         DECIMAL
SET @YEAR_360 = 360.0000000000
SET @daysInPeriod = DATEDIFF(dd, '12/24/1970', '6/29/07')
SET @dcFraction = @daysInPeriod/@YEAR_360

如果在SQL Server 2008 R2中运行此操作,您将看到收到'Arithmetic overflow error converting numeric to data type numeric.'错误。

我设置值的decimal在其可以容纳的位置最大化,我相信是38.我不知道我还能做些什么来获得这个值。您是否应该能够在SQL中将integer除以decimal并从中获取一些内容,尤其是decimal最大化时?

3 个答案:

答案 0 :(得分:7)

在您的示例中,@daysInPeriod/@YEAR_360的值为37.0444444444444444444。因此,您无法将该值分配给数据类型DECIMAL(38,38)的参数,因为您不会留下int部分的空间。 DECIMAL(38,38)表示您可以存储38位数字,其中38位在小数部分,因此任何大于0.999999999999的值都会产生错误。

答案 1 :(得分:1)

问题是您声明@dcFractionDECIMAL(38,38)。你说你想要小数点右边的所有38位数字,左边的整数部分没有空间。

答案 2 :(得分:1)

如果你给小数点一个较小的比例,那就可以了:

DECLARE @daysInPeriod  INT
DECLARE @dcFraction    DECIMAL(38,12)
DECLARE @YEAR_360         DECIMAL
SET @YEAR_360 = 360.0000000000
SET @daysInPeriod = DATEDIFF(dd, '12/24/1970', '6/29/07')
SET @dcFraction = @daysInPeriod/@YEAR_360
select @dcFraction

这会返回37.044444444444