2011-01-10 2 views
1

Я использую эту функцию для получения событий в радиусе 30 миль, в значительной степени такой же, как и ботанический ужин. Но как я могу их заказать «ближе»?distancebetween sql function and order by ближайший

ALTER FUNCTION [dbo].[NearestEvents] 
    ( 
    @lat real, 
    @long real 
) 
RETURNS TABLE 
AS 
    RETURN 
    SELECT Events.ID 
    FROM Events 
    WHERE dbo.DistanceBetween(@lat, @long, Latitude, Longitude) <30 
+0

Если вы хотите одни и те же результаты, но по заказу шкаф, вам, вероятно, нужно хранить данные в временную таблицу, которая включает в себя столбец DistanceBetween, а затем выберите результаты упорядочены в столбце DistanceBetween. Это дополнительная работа, потому что расстояние между ними рассчитывается на лету. – Zachary

ответ

3

Добавьте его в список SELECT.

SELECT Events.ID, 
    dbo.DistanceBetween(@lat, @long, Latitude, Longitude) as distance 
    FROM Events 
    WHERE dbo.DistanceBetween(@lat, @long, Latitude, Longitude) <30 
    ORDER BY distance 

- Поскольку он по-прежнему не работает для OP, хороший способ отладки хранимой процедуры - это захват параметров. Попробуйте это с помощью анализатора запросов и убедиться, что вы получите:

DECLARE @lat = varchar(100); 
DECLARE @long = vavhar(100); 

SET @lat = 'XXXXX'; 
SET @long = 'XXXXX'; 

SELECT Events.ID, 
     dbo.DistanceBetween(@lat, @long, Latitude, Longitude) as distance 
     FROM Events 
     WHERE dbo.DistanceBetween(@lat, @long, Latitude, Longitude) <30 
     ORDER BY distance; 
+0

это не работает. – raklos

+1

запрос отсутствует запятая, должен быть: 'Events.ID, dbo.DistanceBetween (...' –

+0

добавил запятую – Yada