Произошла недопустимая операция с плавающей запятой. SQL Server 2008

У меня странная проблема с этим кодом: если я запускаю его, как показано ниже, я получаю сообщение об ошибке:

Произошла недопустимая операция с плавающей запятой.

Но если я изменю параметр @Longitude на -98.508730 (обратите внимание, что изменилась только последняя цифра), код работает нормально.

Предполагается, что код перечисляет свойства в @MilesRadius вокруг некоторой точки LatLng.
Параметры @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

person bobetko    schedule 12.01.2012    source источник
comment
Вам не хватает части вашего запроса, где вы объявляете переменные, добавьте это к своему вопросу.   -  person Lamak    schedule 12.01.2012
comment
Я сделал. Извините забыл это. Параметры Широта и Долгота имеют тот же тип, что и поля широты и долготы в таблице адресов. Десятичный(10,6)   -  person bobetko    schedule 12.01.2012


Ответы (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
person Martin Smith    schedule 12.01.2012