sql - 发生无效的浮点运算。 SQL Server 2008

标签 sql sql-server-2008 sql-server-2008-r2 floating-point-exceptions

我对这段代码有一个奇怪的问题:如果我像下面所示运行它,我会收到错误:

An invalid floating point operation occurred.

但是如果我将参数@Longitude更改为-98.508730(注意只有最后一位数字发生了变化)代码工作得很好。

该代码应该列出某个 LatLng 点周围 @MilesRadius 中的属性。
@Latitude 和@Longitude 参数与Address 表中的经度和纬度字段类型相同。

我在这里能做什么?谢谢。

DECLARE @Latitude decimal (10,6);
DECLARE @Longitude decimal (10,6);
DECLARE @MilesRadius int;
SET @Latitude = 29.607654
SET @Longitude = -98.508731
SET @MilesRadius  = 5

SELECT     ADR.LineOne as address, 
           ADR.City as city,           
           ADR.Latitude as latitude,
           ADR.Longitude as longitude, 
           ((3959 * acos(cos(radians(@Latitude)) * cos(radians(ADR.Latitude)) * cos(radians(ADR.Longitude) - radians(@Longitude)) + sin(radians(@Latitude)) * sin(radians(ADR.Latitude))))) as distance
FROM       Shared.Address ADR
WHERE      ADR.Latitude IS NOT NULL AND 
           ADR.Longitude IS NOT NULL AND 
           (3959 * acos(cos(radians(@Latitude)) * cos(radians(ADR.Latitude)) * cos(radians(ADR.Longitude) - radians(@Longitude)) + sin(radians(@Latitude)) * sin(radians(ADR.Latitude)))) < @MilesRadius                       
ORDER BY distance

最佳答案

您使用的唯一返回域错误的函数是 ACOS当输入不在 -1 到 +1 范围内时就会发生这种情况,因此您可以随意处理这种情况(我假设中间表达式类似于 1.000000000001 由于舍入误差)

SELECT     ADR.LineOne as address, 
           ADR.City as city,           
           ADR.Latitude as latitude,
           ADR.Longitude as longitude, 
           distance
FROM       Shared.Address ADR
CROSS APPLY (SELECT cos(radians(@Latitude)) * cos(radians(ADR.Latitude)) * cos(radians(ADR.Longitude) - radians(@Longitude)) + sin(radians(@Latitude)) * sin(radians(ADR.Latitude))) T(ACosInput)
CROSS APPLY (SELECT ((3959 * acos(CASE WHEN ABS(ACosInput) > 1 THEN SIGN(ACosInput)*1 ELSE ACosInput END)))) T2(distance)
WHERE      ADR.Latitude IS NOT NULL AND 
           ADR.Longitude IS NOT NULL AND 
           distance < @MilesRadius                       
ORDER BY distance

关于sql - 发生无效的浮点运算。 SQL Server 2008,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8837060/

相关文章:

sql - 在 Postgresql 中将记录数组转换为 JSON

sql-server-2008 - SSIS 将 DataFlow 任务与变量而不是源数据库一起使用

sql - 此查询如何获取当月的第一天?

sql-server - GUID 主键,单独的聚集索引列

sql - DateAdd 列导致溢出

tsql - 哪里存在 - 所有 - 分组依据?

sql - 将 SQL Server 转换为 MySQL

mysql - 如何在 SQL 中对表的每一行调用函数?

.net - 针对 SQL Server 2008 运行时 SqlDataReader.HasRows 是否存在错误?

mysql - 带变量的 Sphinx sql_query