SQL Server Eroare de overflow aritmetică care convertește expresia la tipul de date int

Am un declanșator care se execută după ce o înregistrare este inserată într-un tabel. Declanșatorul practic solicită o funcție și transmite valori din inserție în ea. Cu toate acestea, în timp ce funcționează de câteva ori, continuă să înregistrez următoarea eroare:

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

Declanșatorul este următorul:

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

Am jucat cu el pentru o vreme, dar nu mi se pare că mi-am pus degetul pe problemă, mai ales că lucrează uneori.

2
Mulțumesc lui Mikael, de fapt m-ai ajutat să rezolv problema. Am petrecut atât de mult timp uitându-mă la interogatoriu, am uitat de asta.
adăugat autor Dan, sursa
Este imposibil să spun doar prin analizarea interogării. Probabil că aveți undeva o conversie de tip implicită. S-ar putea ca un parametru al funcției să fie declarat int și să treci un câmp varchar ca argument, care de cele mai multe ori are un număr în el, dar uneori are text. Deci, trebuie doar să vă verificați tipurile de date.
adăugat autor Mikael Eriksson, sursa

1 răspunsuri

Au fost modificate argumentele privind funcția FLOAT, în loc de INT pentru doi dintre parametri.

2
adăugat