SQL Server中的算术溢出

Ech*_*lon 5 sql sql-server math

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

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

哪个错误:

消息8115,级别16,状态6,行1算术溢出错误将float转换为数据类型numeric.

存储过程供参考:

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
Run Code Online (Sandbox Code Playgroud)

还尝试将结果转换为十进制,但没有效果.

Mat*_*lie 4

您的输入是 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
- 将 DECIMAL 显式转换为 FLOAT