9

Ho problema strano con questo codice: se l'eseguo come illustrato di seguito ottengo l'errore:Si è verificata un'operazione in virgola mobile non valida. SQL Server 2008

An invalid floating point operation occurred.

Ma se cambio parametro @Longitude a -98,508730 (preavviso solo ultima cifra cambiato) Il codice funziona bene.

Il codice deve elencare le proprietà in @MilesRadius attorno ad alcuni punti LatLng.
I parametri @Latitude e @Longitude sono dello stesso tipo dei campi di longitudine e latitudine nell'indirizzo della tabella.

Cosa posso fare qui? Grazie.

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 
+2

vi manca la parte della query in cui si dichiarano le variabili, si prega di aggiungere che alla tua domanda – Lamak

+0

ho fatto. Scusa se l'è dimenticato. I parametri Latitudine e Longitudine sono dello stesso tipo dei campi di latitudine e longitudine nella tabella Indirizzi. Decimale (10,6) – bobetko

risposta

10

L'unica funzione che si sta utilizzando che restituisce un errore di dominio è ACOS e che si verifica quando l'ingresso non è nel range -1 to +1 quindi si può solo perdere tempo questo caso (sto assumendo l'espressione intermedia è qualcosa di simile 1.000000000001 a causa di errori di arrotondamento)

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 
+1

Grazie. Funziona bene. :-) – bobetko