【问题标题】:distancebetween sql function and order by closestsql函数与最近排序之间的距离
【发布时间】:2011-01-10 23:41:58
【问题描述】:

我正在使用此功能获取 30 英里内的事件,它与书呆子晚餐几乎相同。但是我怎样才能通过“最近的”来订购它们..?

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 

【问题讨论】:

  • 如果您想要相同的结果但按壁橱排序,您可能需要将数据存储到包含列 DistanceBetween 的临时表中,然后选择在 DistanceBetween 列上排序的结果。这是一些额外的工作,因为它们之间的距离是动态计算的。

标签: sql sql-server nerddinner


【解决方案1】:

将其添加到您的 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;

【讨论】:

  • 查询缺少逗号,应该是:'Events.ID, dbo.DistanceBetween(...'
  • 我试过了,还是不行,我得到:ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP 或 FOR XML .
猜你喜欢
  • 2020-01-26
  • 2022-06-17
  • 1970-01-01
  • 2016-10-31
  • 2017-04-07
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
相关资源
最近更新 更多