发生了无效的浮点运算。 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的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 错误无效的列名“NaN”

MMX 无效的浮点运算

MAX(text) 返回操作数数据类型 text 对于 max 运算符无效。在 sql server 2008 中

JPA 和 SQL Server 的 ORDER BY 子句中的列无效

SQL Server - 包含 FOR XML 要求的无效 XML 标识符;

对于包含无效值的数据集,我应该使用浮点的 NaN 还是浮点 + bool?