2013-07-04 111 views
1

我有一个表有一栏邮编参数化的SQL查询邮政编码和半径不工作

即与具有邮政编码的ID和纬度列和拉链码表

人经度。

我发现了一系列使用纬度和经度计算球体距离(基本上用于邮编)的函数。我对SQL很陌生,想知道如何在存储过程中使用这些函数。

纬度功能:

 ALTER Function [dbo].[LatitudePlusDistance](@StartLatitude Float, @Distance Float) Returns Float 
As 
Begin 
    Return (Select @StartLatitude + Sqrt(@Distance * @Distance/4766.8999155991)) 
End 

经度功能:

ALTER FUNCTION [dbo].[LongitudePlusDistance] 
(
    @StartLongitude float, 
    @StartLatitude float, 
    @Distance float 
) 
    RETURNS Float 
    AS 
begin 

RETURN (select @startLongitude + sqrt(@Distance * @Distance/(4784.39411916406*Cos(2*@StartLatitude/114.591559026165)*Cos(2*@StartLatitude/114.591559026165)))) 
END 
begin 

RETURN (select @startLongitude + sqrt(@Distance * @Distance/(4784.39411916406*Cos(2*@StartLatitude/114.591559026165)*Cos(2*@StartLatitude/114.591559026165)))) 
END` 

计算距离函数

`ALTER Function [dbo].[CalculateDistance] 
    (@Longitude1 Decimal(8,5), 
    @Latitude1 Decimal(8,5), 
    @Longitude2 Decimal(8,5), 
    @Latitude2 Decimal(8,5)) 
Returns Float 
As 
Begin 
Declare @Temp Float 

Set @Temp = sin(@Latitude1/57.2957795130823) * sin(@Latitude2/57.2957795130823) + cos(@Latitude1/57.2957795130823) * cos(@Latitude2/57.2957795130823) * cos(@Longitude2/57.2957795130823 - @Longitude1/57.2957795130823) 

if @Temp > 1 
    Set @Temp = 1 
Else If @Temp < -1 
    Set @Temp = -1 

Return (3958.75586574 * acos(@Temp)) 

End` 

我想这样的事情...

Declare @Longitude Decimal(8,5) 
Declare @Latitude Decimal(8,5) 

Select @Longitude = Longitude, 
     @Latitude = Latitude 
From ZipCodes 
Where ZipCode = '20013' 

    Declare @Distance int 

Select persons.personName, ZipCodes.City, dbo.CalculateDistance(@Longitude, @Latitude, ZipCodes.Longitude, ZipCodes.Latitude) As Distance 
From persons 
     Inner Join ZipCodes 
      On persons.zipcode = ZipCodes.ZipCode 
Order By dbo.CalculateDistance(@Longitude, @Latitude, ZipCodes.Longitude, ZipCodes.Latitude) 
    WHERE dbo.CalculateDistance(@Longitude, @Latitude, ZipCodes.Longitude, ZipCodes.Latitude) As Distance <= @Distance 

我试过这个只是为了过滤参数化搜索半径之外的人,它不起作用。说有一个“关键字附近的语法不正确‘其中’

这还不包括我的愿望在为邮编参数扔所以不是:

其中邮政编码=‘20013’

我想是这样的:

其中邮政编码= @zipcode

,但它说我需要声明zscalar变量@zipcode不管在哪里我试图做到这一点...我不断收到同样的错误

感谢您的帮助

回答

1

之前使用的是“排序依据”条款“其中”这是问题之一,你不能用在条件的另一个问题是别名。请尝试以下查询:

Declare @Longitude Decimal(8,5) 
Declare @Latitude Decimal(8,5) 

Select @Longitude = Longitude, 
     @Latitude = Latitude 
From ZipCodes 
Where ZipCode = '20013' 

Declare @Distance int 
set @Distance = 5 

Select persons.personName, ZipCodes.City, dbo.CalculateDistance(@Longitude, @Latitude, ZipCodes.Longitude, ZipCodes.Latitude) As Distance 
From persons Inner Join ZipCodes On persons.zipcode = ZipCodes.ZipCode 
WHERE dbo.CalculateDistance(@Longitude, @Latitude, ZipCodes.Longitude, ZipCodes.Latitude) <= @Distance 
Order By dbo.CalculateDistance(@Longitude, @Latitude, ZipCodes.Longitude, ZipCodes.Latitude) 
+0

试过了。我全部拿出了这个命令的子句。似乎没有工作。也没有要求我输入@distance输入。 – user2369145

+0

刚刚编辑了查询。新增set @Distance = 5。从那里你可以设置你的距离。 –

+0

仍然不起作用:(我应该说(希望这将有助于诊断问题)我正在使用vb web开发人员,我只是在“新查询”向导中尝试这一切。是否有所作为? – user2369145