发生了无效的浮点运算。 SQL Server 2008
Posted
技术标签:
【中文标题】发生了无效的浮点运算。 SQL Server 2008【英文标题】:An invalid floating point operation occurred. SQL Server 2008 【发布时间】:2012-01-12 14:53:56 【问题描述】:我对这段代码有一个奇怪的问题:如果我按如下所示运行它,我会收到错误:
发生了无效的浮点运算。
但是,如果我将参数 @Longitude
更改为 -98.508730 (只注意最后一位更改),代码就可以正常工作。
代码应该列出 @MilesRadius
中某个 LatLng 点周围的属性。
@Latitude 和 @Longitude 参数与地址表中的经度和纬度字段的类型相同。
我可以在这里做什么?谢谢。
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
【问题讨论】:
您缺少声明变量的查询部分,请将其添加到您的问题中 我做到了。抱歉忘记了。参数纬度和经度与地址表中的纬度和经度字段的类型相同。十进制(10,6) 【参考方案1】:您使用的唯一返回域错误的函数是ACOS
,并且当输入不在-1 to +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 Server 2008的主要内容,如果未能解决你的问题,请参考以下文章
MAX(text) 返回操作数数据类型 text 对于 max 运算符无效。在 sql server 2008 中
JPA 和 SQL Server 的 ORDER BY 子句中的列无效