我有一个存储过程,该过程以浮点形式计算两个坐标对之间的距离。我正在尝试使用它来过滤值列表,但遇到算术溢出错误。查询是:

SELECT * FROM Housing h  WHERE convert(float, dbo.CalculateDistance(35, -94, h.Latitude, h.Longitude)) <= 30.0

哪些错误:



该存储过程供引用:
CREATE FUNCTION [dbo].[CalculateDistance]
    (@Longitude1 DECIMAL(8,5),
    @Latitude1   DECIMAL(8,5),
    @Longitude2  DECIMAL(8,5),
    @Latitude2   DECIMAL(8,5))
RETURNS FLOAT
AS
BEGIN
DECLARE @Temp FLOAT

SET @Temp = SIN(@Latitude1/57.2957795130823) * SIN(@Latitude2/57.2957795130823) + COS(@Latitude1/57.2957795130823) * COS(@Latitude2/57.2957795130823) * COS(@Longitude2/57.2957795130823 - @Longitude1/57.2957795130823)

IF @Temp > 1
    SET @Temp = 1
ELSE IF @Temp < -1
    SET @Temp = -1

RETURN (3958.75586574 * ACOS(@Temp) )

END

还尝试将结果转换为十进制无效。

最佳答案

您的输入为DECIMAL(8,5)。这意味着等式由例如SIN(DECIMAL(8,5) / 57.2957795130823)组成。其中57.2957795130823不能表示为DECIMAL(8,5)。

这意味着由于数据类型不同,您可能需要进行CAST操作。在这种情况下,似乎57.2957795130823被强制转换为DECIMAL(8,5)[一个数字],并导致溢出。

我会推荐以下任何一种:
-更改功能以将输入作为FLOATS。即使该函数是用数字调用的
-将57.2957795130823更改为57.29577
-明确将十进制转换为FLOAT

09-27 06:47