2017-03-22 60 views
0

這是一個垃圾拍攝,但我想我會挑選更有經驗的大腦。t-SQL:選擇語句內部的地理POINT字符串

正如您可能知道的那樣,您可以使用下面的查詢來查找兩組座標之間的距離。

DECLARE @source geography = 'POINT(-93.54803 39.790132)' 
DECLARE @target geography = 'POINT(-105.0207 39.9652)' 
SELECT @source.STDistance(@target)/1609.344 AS distance_in_miles 

我就想辦法找到兩個郵政編碼之間的距離,而不必使用haversine公式,所以我寫了這個:

DECLARE @source GEOGRAPHY 
DECLARE @target GEOGRAPHY 
DECLARE @Szip VARCHAR(10) = '64601' 
DECLARE @Ezip VARCHAR(10) = '80023' 
SET @source = (SELECT longitude+ ' ' +latitude FROM us_loc_data WHERE @Szip = zip) 
SET @target = (SELECT longitude+ ' ' +latitude FROM us_loc_data WHERE @Ezip = zip) 
SELECT @source.STDistance(@target)/1609.344 AS distance_in_miles 

我沒想到上面會工作,它並沒有因爲這個原因工作:

消息6522,級別16,狀態1,行的用戶定義的例程或聚合「地理」執行過程中出現5 一個.NET Framework錯誤: System.FormatException: 24114:Th在輸入衆所周知的文本(WKT)中的e標籤-93.54803 39.790132無效。

我目前的理解是,爲了真正起作用,在括號中封裝的一對座標需要夾在字符串開始處的帶POINT的引號之間。

我想知道我正在嘗試做什麼是遠程可能的。 我可以以某種方式將選擇語句分配給我的變量(@source & @target)以查詢座標而不是明確指定哪個座標我想要使用?

回答

1

DECLARE @Origin GEOGRAPHY 
DECLARE @Target GEOGRAPHY 
DECLARE @Szip VARCHAR(10) = '64601' 
DECLARE @Ezip VARCHAR(10) = '80023' 
Select @Origin =GEOGRAPHY::Point([latitude], [longitude], 4326) from us_loc_data WHERE @Szip = zip 
Select @Target =GEOGRAPHY::Point([latitude], [longitude], 4326) from us_loc_data WHERE @Ezip = zip 
SELECT Distance = @Origin.STDistance(@Target)/1609.344 

返回(使用我郵政編碼數據庫)

610.093230351351 
+0

再次感謝您對我的幫助,再次:) –

+0

@AnthonySims快樂幫,.. ... :) –