9

Tôi có vấn đề lạ với mã này: nếu tôi chạy nó như hình dưới đây tôi nhận được lỗi:Đã xảy ra hoạt động điểm động không hợp lệ. SQL Server 2008

An invalid floating point operation occurred.

Nhưng nếu tôi thay đổi thông số @Longitude để -98,508730 (thông báo chỉ số cuối cùng đã thay đổi) mã hoạt động tốt.

Mã được yêu cầu liệt kê các thuộc tính trong @MilesRadius xung quanh một số điểm LatLng.
@Thông số và các thông số @ Độ dài có cùng loại với trường kinh độ và vĩ độ trong bảng Địa chỉ.

Tôi có thể làm gì ở đây? Cảm ơn.

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

bạn đang thiếu một phần của truy vấn của bạn, nơi bạn khai báo các biến, xin vui lòng thêm rằng câu hỏi của bạn – Lamak

+0

tôi đã làm. Xin lỗi quên điều đó. Tham số Vĩ độ và Kinh độ có cùng loại với các trường vĩ độ và kinh độ trong bảng Địa chỉ. Thập phân (10,6) – bobetko

Trả lời

10

Chức năng duy nhất mà bạn đang sử dụng mà trả về một lỗi miền là ACOS và xảy ra khi đầu vào không nằm trong phạm vi -1 to +1 vì vậy bạn chỉ có thể fiddle trường hợp này (tôi giả sử biểu thức trung gian là một cái gì đó như 1.000000000001 do lỗi làm tròn)

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

Cảm ơn bạn. Hoạt động tốt. :-) – bobetko

Các vấn đề liên quan