我有一个非常简单的函数来计算和格式化浮点数:
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调试器进入函数?
答案 0 :(得分:0)
要解决第一个错误,请不要为变量赋值。第二个错误是由您使用TSQL FORMAT语句引起的。 format语句返回VARCHAR而不是FLOAT。有关FORMAT命令的信息,请参阅此链接。 MSDN link