【发布时间】:2013-07-07 05:35:03
【问题描述】:
好的,我已经搜索了 SO 和 Google,但还没有真正找到明确的答案,所以把它扔给 SO 社区。p>
基本上我有一个特定兴趣点的经度和纬度表,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 时出错 转为数字。
任何人能够解决上述代码或提出更好的解决方案?
【问题讨论】:
-
这可能就是你要找的stackoverflow.com/questions/592209/…
-
如果建议的主题对您没有帮助,请发布您的示例数据。
-
大家好,感谢您的建议,但是这两个链接似乎都没有明确给出我正在寻找的答案,如果它有帮助的话,我已经稍微扩展了我的问题?
-
在你的例子中,距离是英里还是公里?
标签: sql sql-server database tsql sql-server-2012