我看过许多类似于我的SO问题,但在我的具体案例中,我似乎无法做任何事情。我有一个基于半径的搜索的实现,使用邮政编码和半径可以正常工作,但准确性有点低,因为人们可以住在他们的邮政编码的边缘,它限制应用程序到达只有邮政编码的地方。所以我要做的是使用用户位置的纬度和经度,并使用sql server空间功能,从我的Locations表中返回一个id列表,其中纬度和经度在用户定义的半径内。以下是我到目前为止的情况:
SELECT Id FROM Location WHERE (GetDistanceBetween(39.0997, 94.5783, Latitude,
Longitude)<=5)
GetDistanceBetween定义如下:
FUNCTION [GetDistanceBetween]
(
@Lat1 float,
@Long1 float,
@Lat2 float,
@Long2 float
)
RETURNS float
AS
BEGIN
DECLARE @RetVal float;
DECLARE @startPoint geography;
DECLARE @endPoint geography;
SET @startPoint = geography::Point(@Lat1, @Long1, 4326)
SET @endPoint = geography::Point(@Lat2, @Long2, 4326)
SET @RetVal = (SELECT @startPoint.STDistance(@endPoint) / 3959 );
RETURN @RetVal;
END
“位置”表包含三列,纬度,经度和ID。每个Location行都属于另一个表我需要信息的地址。我在存储过程中尝试做的是:
PROCEDURE [dbo].[GetGeoObjectsInRange](
@startLat as float (10),
@startLong as float(10),
@range as numeric (15)
)
AS
BEGIN
Select * from dbo.Address WHERE geolocation_id in (SELECT Id from Location
WHERE GetDistanceBetween(@startLat, @startLong, Latitude, Longitude)<=@range)
RETURN
END
正如您所看到的,我正在尝试将GetDistanceBetween调用的结果传递给另一个select。这当前返回没有结果,而我的另一种方式返回39结果。谁能看到我做错了什么?我不是一个真正的数据库人,但只是一个项目的开发人员迫使我学习我的方式。 如果重要,我使用NHibernate从C#MVC3应用程序调用存储过程。
我感谢任何帮助。