t-SQL: оператор select внутри строки POINT geography

Это дерьмо, но я решил, что все равно выберу мозги более опытных.

Как вы, наверное, знаете, вы можете использовать приведенный ниже запрос, чтобы найти расстояние между двумя наборами координат.

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 во время выполнения определяемой пользователем подпрограммы или совокупной "географии": System.FormatException: 24114: метка -93.54803 39.790132 во входных данных известна текст (WKT) недействителен.

Насколько я понимаю, для того, чтобы это действительно работало, пара координат, заключенная в круглые скобки, должна быть зажата между кавычками с POINT в начале строки.

Мне интересно, возможно ли то, что я пытаюсь сделать, удаленно. Могу ли я каким-то образом назначить операторы select своим переменным (@source и @target) для запроса координат вместо того, чтобы явно указывать какие координаты, которые я хочу использовать?


person Anthony Sims    schedule 22.03.2017    source источник


Ответы (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
person John Cappelletti    schedule 23.03.2017
comment
Спасибо за помощь, еще раз :) - person Anthony Sims; 23.03.2017
comment
@AnthonySims Рад помочь, .. снова ... :) - person John Cappelletti; 23.03.2017