visual una studio relacionado que puerto puede pudo mientras microsoft instancia especifico error conexión conectar conecta con abrir sql sql-server-2008 sql-server-2008-r2 floating-point-exceptions

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