t-SQL: select geography POINT 字符串中的语句

t-SQL: select statement inside of geography POINT string

这是一个废话,但我想无论如何我都会挑选更有经验的人的大脑。

您可能知道,您可以使用以下查询来查找两组坐标之间的距离。

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

我想要一种无需使用半正弦公式即可找到两个邮政编码之间距离的方法,所以我这样写:

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 错误 "geography": System.FormatException: 24114: 输入的知名文本 (WKT) 中的标签 -93.54803 39.790132 无效。

我目前的理解是,为了使其真正起作用,封装在括号中的一对坐标需要夹在字符串开头的 POINT 引号之间。

我想知道我尝试做的事情是否可行。 我能否以某种方式将 select 语句分配给我的变量 (@source 和 @target) 以查询坐标,而不是明确指定我想使用的 哪个 坐标?

例子

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

Returns(使用我的邮政编码数据库)

610.093230351351