好的,我已经搜索了 SO 和 Google,但还没有真正找到明确的答案,所以把它扔给 SO 社区。
基本上我有一个特定兴趣点的经度和纬度表,sql查询将知道您当前所在的位置(这将是表中的位置之一,作为参数传入),因此它需要计算并将与传入的最接近的纬度和经度的一行返回。
我要求这一切都在 MSSQL(2012 / 存储过程)中完成,而不是在调用应用程序(即 .NET)中完成,因为我听说 SQL 在处理此类查询时通常比 .NET 快得多?
编辑:
我找到了 STDistance 函数,它给出了位置之间的英里数,例如:
DECLARE @NWI geography, @EDI geography
SET @NWI = geography::Point(52.675833,1.282778,4326)
SET @EDI = geography::Point(55.95,-3.3725,4326)
SELECT @NWI.STDistance(@EDI) / 1000
但是我不想遍历表中的所有纬度/经度,因为这对性能肯定会很糟糕吗?
我还尝试转换以下评论链接之一中指出的示例之一(这是 MYSQL 而不是 MSSQL)但是我收到错误,代码如下:
DECLARE @orig_lat decimal(6,2), @orig_long decimal(6,2), @bounding_distance int
set @orig_lat=52.056736;
set @orig_long=1.14822;
set @bounding_distance=1;
SELECT *,((ACOS(SIN(@orig_lat * PI() / 180) * SIN('lat' * PI() / 180) + COS(@orig_lat * PI() / 180) * COS('lat' * PI() / 180) * COS((@orig_long - 'lon') * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS 'distance'
FROM [DB1].[dbo].[LatLons]
WHERE
(
'lat' BETWEEN (@orig_lat - @bounding_distance) AND (@orig_lat + @bounding_distance)
AND 'lon' BETWEEN (@orig_long - @bounding_distance) AND (@orig_long + @bounding_distance)
)
ORDER BY 'distance' ASC
收到的错误是:
消息 8114,级别 16,状态 5,第 6 行将数据类型 varchar 转换为数字时出错。
任何人都能够解决上述代码或提出更好的解决方案?