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

我一直在玩它一段时间,但似乎无法把我的手指放在这个问题上,特别是考虑到它有时候有效。

2
额外 编辑
意见: 1
谢谢Mikael,你真的帮我解决了这个问题。我花了很多时间查看查询,我忘记了这一点。
额外 作者 Dan,
仅仅通过查询查询是不可能的。您可能会在某处进行隐式类型转换。这可能是该函数的一个参数被声明为int,并且您传递了一个varchar字段作为参数,其中大部分时间都有一个数字,但有时它具有文本。所以你只需要检查你的数据类型。
额外 作者 Mikael Eriksson,

1 答案

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

2
额外