zipcode和radius的参数化sql查询不起作用

本文关键字:sql 查询 不起作用 参数 radius zipcode | 更新日期: 2023-09-27 18:20:52

我有一个表

拥有列邮政编码的人员

这与一个zipcodes表有关,该表以zipcode为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=@zipcode

但它说我需要声明zscalar变量@zipcode,无论我在哪里尝试。。。我一直收到相同的错误

感谢的帮助

zipcode和radius的参数化sql查询不起作用

您在"where"之前使用了"order by"子句,这是问题之一,而不能在where条件是另一个问题时使用别名。请尝试以下查询:

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)