Это намного сложнее, чем то, что написал @Nikolaus, широта и долгота на сфере (Земле) и не выражены в милях, поэтому пифагорейская тройка здесь не применима.Следуя формуле , объясненной здесь , мы получим следующую функцию в SQL Server для вычисления расстояния:
CREATE FUNCTION dbo.spatialDistance(@lat1 DECIMAL, @lon1 DECIMAL, @lat2 DECIMAL, @lon2 DECIMAL)
RETURNS TABLE
AS
RETURN (
SELECT 6371 * Calc2.c AS DistanceKm
, 3958.8 * Calc2.c AS DistanceMi
FROM (SELECT RADIANS(@lat1) AS Lat1
, RADIANS(@lat2) AS Lat2
, RADIANS(@lat2 - @lat1) AS dLat
, RADIANS(@lon2 - @lon1) AS dLon) conv
CROSS
APPLY (SELECT a = SQUARE(SIN(dLat/2.0)) + SQUARE(SIN(dLon/2.0)) * COS(Lat1) * COS(Lat2)) Calc1
CROSS
APPLY (SELECT c = 2 * ATN2(SQRT(Calc1.a), SQRT(1 - Calc1.a))) AS Calc2
)
Затем вы можете написать желаемую функцию следующим образом:
CREATE FUNCTION dbo.GetAvailableSalesByDistance(@Lat decimal, @Long decimal, @RangeInMiles int)
RETURNS Table
AS
RETURN (
SELECT l.loc_id
FROM Locations AS l
CROSS
APPLY dbo.spatialDistance(l.loc_latitude, l.loc_longitude, @Lat, @Long) dist
WHERE dist.DistanceMi <= @RangeInMiles
)
Примечание. Я использую встроенные табличные функции.Скалярные функции и TVF с несколькими утверждениями, которые вы использовали в своем вопросе, ужасны для производительности и не должны использоваться. Смотрите здесь для объяснения, если вы заинтересованы .