0

다른 사람이 버그인지 확인하거나 잘못된 조치를 취하고 있습니까? SQL Server 지리의 버그?

I

ALTER PROCEDURE [dbo].[Distance] 
@origin varchar(50),@destination varchar(50),@unit varchar(5) 
as 
    declare @or geography, @dest geography 
    SET @or = (select Location from [dbo].Promotion where [email protected]) 
    SET @dest = (select Location from [dbo].Promotion where [email protected]) 
IF @unit='miles' 
SELECT @or.STDistance(@dest)/1609.344 
ELSE 
--Else show the distance in km 
SELECT @or.STDistance(@dest)/1000 

위치 데이터베이스

지리 데이터 타입은 내가 그런 다음 데이터베이스

 Latitude  Longitude 
1 -34.612654 -58.463586 
2 -34.592802 -58.454317 
3 -34.597889 -58.617949 

이 주소를했습니다이 저장 프로 시저 (SQL 서버 2008)했습니다

execute dbo.Distance 'Number 1','Number 2','km' 
returns 2653.49845233371 kms 

execute dbo.Distance 'Number 1','Number 3','km' 
returns 17.2155414117145 kms 
이 실행 첫 번째 경우 Google지도에 가면

는 주위 사람들 좌표 betweeen 4 킬로미터이며, 두 번째 비교 확인 될 것으로 보인다.

첫 번째 이유가 왜 그렇게 잘못 되었습니까? SQL Server의 버그입니까?

미리 감사드립니다. 기예르모.

+1

큰 응용 프로그램을 사용하는 첫 번째 규칙은 수백만 명의 사람들이 사용하는 것으로서 버그는 코드에 있습니다. 두 번째 규칙 - 버그가 코드에 있습니다. 세 번째 규칙 .... 당신은 아이디어를 얻을;) – Jamiec

+0

위치가 위도 및 경도 열을 기반으로 계산 열이라고 가정합니까? 그렇다면 정의를 줄 수 있습니까? 이에 좋은 이유가 될 것입니다 –

답변

0

좋아, 나는 문제가 무엇인지 발견했습니다, 그리고 예, 물론 제가 그런 다음이

INSERT INTO [dbo].[TestLocation]([Name],[Location],[Latitude],[Longitude]) VALUES('Location1', geography::STGeomFromText('POINT(-34.612654 -58.463586)', 4326),-34.612654,-58.463586); 

같은 테이블에서 레코드를 삽입 한 내 잘못이 :

내가 실현 나는 순서대로 다음 변경 있었으나 결국 마지막 두 개의 필드와 '지역 :: STGeomFromText "의 순서를 변경하는 것을 잊었다했습니다 그래서 처음에는, 위도와 경도는 반전되었다. 실행 후

SELECT 
    Ubicacion.Lat, 
    Ubicacion.Long 
FROM 
    Promotion 

나는 무엇이 오류인지 깨달았다. 도!

는 위의 쿼리를 실행하지 않는 한 당신의 소스를 인식하지 않습니다, 지리 데이터 형식 바이너리로 저장됩니다대로 사람이 읽을되지 않도록
SELECT 
    Ubicacion.Lat, 
    Ubicacion.Long 
FROM 
    Promotion 

이 알고 있어야

으로이 알고 있어야합니다, 그래서 문제.

감사합니다. 기예르모.

+1

(간단한 테이블, 샘플 데이터로 채울 수있는'INSERT'을 만들 수 있다면 훨씬 쉬울 것, 그리고 다른 사람이 재현 할 수 있도록 간단한 쿼리는 결과를 생성하는) 'Location'의 정의를'Location geography not null'에서'Location AS geography :: Point (Latitude, Longitude, 4326)'로 변경하십시오. 또는 다른 방법으로 계산 값을 저장하지 마십시오. (선택적으로'persisted not null'을 추가하면 색인이 생성 될 수도 있습니다.) –

+0

나는 그것을 검사 할 것입니다. 감사! – polonskyg