2012-05-25 44 views
2

我有一个触发器,将记录插入到表中后执行。基本上,触发器调用一个函数并将插入的值传递给它。然而,虽然它的工作原理有些时候,我也不断收到以下错误:SQL Server算术溢出错误将表达式转换为数据类型int

Msg 8115, Level 16, State 2, Procedure UpdateNabersRating, Line 17 
Arithmetic overflow error converting expression to data type int. 

触发如下:

UPDATE BMS_Snapshot SET 
    NABERS = dbo.SetmetricsNABERSCalculation(
     60, 
     tbl.NetFloorArea, 
     tbl.ElectricityCumulative, 
     tbl.GasCumulative, 
     tbl.ElectricityCumulativeMax, 
     tbl.GasCumulativeMax, 
     tbl.ElectricityMaxTotal, 
     tbl.GasMaxTotal, 
     tbl.NaturalGasConversionCubicMetersToMJ, 
     tbl.SuburbId) 
FROM 
    (SELECT 
     Snap.SnapshotId AS SnapshotId, 
     Snap.ElectricityCumulative AS ElectricityCumulative, 
     Snap.GasCumulative AS GasCumulative, 
     Building.NetFloorArea AS NetFloorArea, 
     Building.NABERSElecTotalMax AS ElectricityMaxTotal, 
     Building.NABERSGasTotalMax AS GasMaxTotal, 
     Building.NABERSExpiry As Expiry, 
     NABERSTarget.ElecCumulativeMax AS ElectricityCumulativeMax, 
     NABERSTarget.GasCumulativeMax AS GasCumulativeMax, 
     [State].NaturalGasConversionCubicMetersToMJ AS NaturalGasConversionCubicMetersToMJ, 
     Suburb.SuburbId AS SuburbId 
    FROM inserted AS Snap 
     INNER JOIN AST_Building AS Building ON Snap.BuildingId = Building.BuildingId 
     INNER JOIN ESD_Suburb AS Suburb ON Building.SuburbId = Suburb.SuburbId 
     INNER JOIN ESD_State AS [State] ON Suburb.StateId = [State].StateId 
     INNER JOIN AST_NABERSTarget NABERSTarget ON Snap.BuildingId = NABERSTarget.BuildingId AND 
      Snap.TimeStamp = NABERSTarget.Timestamp 
     /*Where Snap.SnapshotId IN (Select inserted.SnapshotId FROM inserted)*/) AS tbl 
WHERE tbl.SnapshotId = BMS_Snapshot.SnapshotId AND BMS_Snapshot.Range = 1 

我已经玩了一会儿,但能似乎并没有把我的手指放在这个问题上,特别是考虑到它有时会起作用。

+0

仅仅通过查看查询是不可能的。您可能会在某处进行隐式类型转换。这可能是该函数的一个参数被声明为int,并且您传递了一个varchar字段作为参数,其中大部分时间都有一个数字,但有时它具有文本。所以你只需要检查你的数据类型。 –

+0

感谢Mikael,你确实帮我解决了这个问题。我花了很多时间查看查询,我忘记了这一点。 – Dan

回答

2

将函数的参数更改为FLOAT,而不是对两个参数的INT。

相关问题