title: SQL Server Arithmetic overflow error converting expression to data type int
body: <p>I have a trigger which executes after a record is inserted into a table. The trigger basically, calls a function and passes values from the insert into it. However, while it works some times, I also keep getting the following error:</p>
  
  <pre><code>Msg 8115, Level 16, State 2, Procedure UpdateNabersRating, Line 17
  Arithmetic overflow error converting expression to data type int.
  </code></pre>
  
  <p>The trigger is as follows:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>I've been playing around with it for a while, but can't seem to put my finger on the problem, particularly given it works sometimes.</p>