2017-03-22 24 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快乐帮,.. ... :) –