SQL函数错误:算术溢出

时间:2015-08-19 11:36:49

标签: tsql sql-function

我有一个非常简单的函数来计算和格式化浮点数:

ALTER FUNCTION GetUrbanHours 
(
-- Add the parameters for the function here
@driverID int
)
RETURNS int
AS
BEGIN
DECLARE @Result float = 0

SELECT @Result = 
    FORMAT(
        SUM(CONVERT(float, 
            CONVERT(bigint, RouteSummary.UrbanNightSeconds + RouteSummary.UrbanDaySeconds))/(60*60)),
        '##,##0.00')
    FROM RouteSummary WHERE DriverID = @driverID

-- Return the result of the function
RETURN @Result

END

当我使用给定参数调用函数时,出现以下错误:

Msg 8115, Level 16, State 2, Line 6
Arithmetic overflow error converting expression to data type int.
Msg 8114, Level 16, State 5, Line 9
Error converting data type varchar to float.

当我解压缩SELECT语句并打印@Result时,我得到了预期的结果。我的问题在这里是什么?

修改

我已按如下方式重写了该功能:

ALTER FUNCTION GetUrbanHours 
(
@driverID int
)
RETURNS nvarchar(50)
AS
BEGIN
DECLARE @Result nvarchar(50)
DECLARE @SumSeconds bigint
DECLARE @SumHours float

SELECT @SumSeconds = 
    SUM(RouteSummary.UrbanNightSeconds + RouteSummary.UrbanDaySeconds)
    FROM RouteSummary WHERE DriverID = @driverID
IF @SumSeconds != NULL
BEGIN
    SET @SumHours = CONVERT(float, @SumSeconds) / (60*60)
    SET @Result = 
        FORMAT(@SumHours, '##,##0.00')
END
RETURN @Result

END

当我给出一个从RouteSummary表返回行的参数时,我得到NULL。当我给出一个不返回任何行的参数时,我得到“消息8115,级别16,状态2,行1算术溢出错误,将表达式转换为数据类型int”。现在有什么问题?还有一种方法可以识别错误消息所引用的函数中的行吗?为什么我不能使用SQL Studio调试器进入函数?

1 个答案:

答案 0 :(得分:0)

要解决第一个错误,请不要为变量赋值。第二个错误是由您使用TSQL FORMAT语句引起的。 format语句返回VARCHAR而不是FLOAT。有关FORMAT命令的信息,请参阅此链接。 MSDN link