una - microsoft sql server error 2
Se produjo una operación de coma flotante no válida. SQL Server 2008 (1)
Tengo un problema extraño con este código: si lo ejecuto como se muestra a continuación, obtengo un error:
Se produjo una operación de coma flotante no válida.
Pero si cambio el parámetro @Longitude
a -98.508730 (el código de aviso solo cambió ) el código funciona bien.
Se supone que el código enumera propiedades en @MilesRadius
alrededor de algún punto LatLng.
Los parámetros @Latitude y @Longitude son del mismo tipo que los campos de longitud y latitud en la dirección de la tabla.
¿Qué puedo hacer aquí? Gracias.
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
La única función que está utilizando que devuelve un error de dominio es ACOS
y eso ocurre cuando la entrada no está en el rango de -1 to +1
por lo que puede solucionar este caso (supongo que la expresión intermedia es algo así como 1.000000000001
debido a errores de redondeo)
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