查询导致msg 8115

时间:2014-07-14 13:47:18

标签: sql sql-server-2012

我不确定以下查询导致以下错误的原因:

  

Msg 8115,Level 16,State 2,Line 2
  将表达式转换为数据类型int的算术溢出错误。

查询:

SELECT 
    (SUM(rLSP.PoundsMade) / (SUM(rLSAh.rpt_Line_Shift_AvailableHrs) - (SUM(cast((PD. [End Time] 
    - PD.[Start Time]) as float)))))*(SUM(rLSPdt.DownTimeHrs)*(60*60) + SUM(rLSPdt.DownTimeMins)*60)
FROM 
    rpt_Line_Shift_Prod as rLSP
INNER JOIN 
    rpt_Line_Shift_AvailableHrs as rLSAh ON rLSAh.LineNumber = rLSP.LineNumber
INNER JOIN 
    [Production Downtime] as PD ON rLSP.LineNumber = PD.[Line #]
INNER JOIN 
    rpt_Line_Shift_ProdDownTime as rLSPdt ON rLSPdt.LineNumber = rLSP.LineNumber
GROUP BY
    PD.[Line #], rLSP.LineNumber, rLSAh.LineNumber;

如何修复此错误?我使用了相同类型的SUM语句,其中我将日期时间作为浮点数多次转换,没有错误。

1 个答案:

答案 0 :(得分:0)

这很可能是因为用于计算的列使用的数据类型无法保存某些计算结果。

如果你试试这个,你可以轻松地重现这个:

DECLARE @IFlowOver TABLE (ID INT PRIMARY KEY IDENTITY(1,1), Val INT)

INSERT @IFlowOver (Val)
    SELECT 2000000000


SELECT Val*Val FROM @IFlowOver

SELECT会抛出相同的错误,因为无法在int范围内表示2,000,000,000次2,000,000,000次。

为了避免这种情况,您可以CAST将列SELECT更宽泛的数据类型进行计算。 我的上述示例BIGINT例如,如果我仅仅为了计算而转换为SELECT CAST(Val AS BIGINT) * CAST(Val AS BIGINT) FROM @IFlowOver

CAST

但如果只有一方是SELECT CAST(Val AS BIGINT) * Val FROM @IFlowOver

,它也有效
{{1}}