算术溢出错误...请帮助。 SQL

时间:2013-06-20 18:24:51

标签: sql sql-server sql-server-2012

我收到错误

  

将表达式转换为数据类型float

的算术溢出错误

以下代码:

SELECT b.[CUSIP NUMBER],
   b.[PASS THRU RATE],
   a.[CURRENT BALANCE],
   b.[ORIGINAL WA MATURITY],
   b.[CURRENT WA MATURITY],
   (b.[ORIGINAL BALANCE] * ((b.[PASS THRU RATE]*.01)/12))/ (1-((1 + power (( (b.[PASS THRU RATE]*.01 )/ 12), -b.[ORIGINAL WA MATURITY] ) )))

   FROM DBO.mbs012013 a, DBO.mbs022013 b
   WHERE a.[CUSIP NUMBER] = b.[CUSIP NUMBER]

我没有指定数字是任何特定类型,所以我不知道为什么我收到此错误。如果有人能告诉我如何解决这个问题,那将非常感激。

供参考:cusip数字是一个序列号,其余是输入(利率,银行存款余额,以月为单位的成熟度等)

2 个答案:

答案 0 :(得分:2)

您说PASS THRU RATE可以是1-10ORIGINAL WA MATURITY可以是0 - 360

最糟糕的情况是PASS THRU RATE = 1和ORIGINAL WA MATURITY = 360

在那种情况下你会做

SELECT POWER(0.0008333333333, -360)

其结果为3.2E+1108。 SQL Server中没有数据类型的范围大于float,“仅”允许范围± 1.79E+308

如果您需要进行这些计算,则需要在TSQL之外完成。但你确定你的公式实际上是正确的吗?

它不应该是其中之一吗?

SELECT POWER(1 + 0.0008333333333, -360)

SELECT POWER(1 - 0.0008333333333, -360)

答案 1 :(得分:0)

问题可能在这里:

power (( (b.[PASS THRU RATE]*.01 )/ 12), -b.[ORIGINAL WA MATURITY] )

如果b.[PASS THRU RATE]很小并且-b.[ORIGINAL WA MATURITY]很大,那么最终结果可能会超过NUMERIC类型可以容纳的结果。尝试将它们转换为浮点数:

power (( CAST(b.[PASS THRU RATE]*.01 / 12) AS FLOAT), -b.[ORIGINAL WA MATURITY] ) )))