2013-07-04 40 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