2013-05-27 89 views
1

我有2個存儲過程從表Places中檢索數據。這些過程一次由C#代碼調用。這些是表列。SQL Server 2008:一個存儲過程中的多個查詢

[ID] int NOT NULL IDENTITY(1, 1), 
    [Name] varchar(150) NOT NULL, 
    [Latitude] decimal(18, 2) NOT NULL, 
    [Longitude] decimal(18, 2) NOT NULL 

這些是2個存儲過程

CREATE procedure dbo.GetPlacesByID 
    @ID int 
AS 
SELECT * 
FROM dbo.Places 
WHERE ID = @ID 
GO 

CREATE procedure dbo.GetNearbyPlaces 
    @Min_Lat decimal(18, 2), 
    @Min_Lng decimal(18, 2), 
    @Max_Lat decimal(18, 2), 
    @Max_Lng decimal(18, 2) 
AS 
SELECT * 
FROM dbo.Places 
WHERE Latitude BETWEEN @Min_Lat AND @Max_Lat 
AND Longitude BETWEEN @Min_Lng AND @Max_Lng 
ORDER By ID ASC 
GO 

C#的應用程序調用GetPlacesByID第一。如果返回一行,應用程序將獲取緯度和經度數據,並通過加上或減去常數0.005來計算@max_Lng,@Min_Lng,@Max_Lat@Max_Long變量。這些變量會傳遞給GetNearbyPlaces sp,它會返回附近的地方,應用程序會在Google地圖上顯示原始地點以及附近的地點。

這工作正常,但有兩個往返數據庫,這不是很有效。 我想這兩個程序的東西組合成一個像

create procedure dbo.GetPlaces 
    @ID int 
select * from dbo.Places as Row1 
where [email protected] 
if Row1 is not null 
    Declare @Min_Lat decimal(18, 2), 
    Declare @Min_Lng decimal(18, 2), 
    Declare @Max_Lat decimal(18, 2), 
    Declare @Max_Lng decimal(18, 2) 

    Set @Min_Lat=Row1.Latitude - 0.005 
    Set @Min_Lng=Row1.Longitude - 0.005 
    Set @Max_Lat=Row1.Latitude + 0.005 
    Set @Max_Lng=Row1.Longitude + 0.005 

select * from dbo.Places 
where Latitude BETWEEN @Min_Lat AND @Max_Lat 
and Longitude BETWEEN @Min_Lng AND @Max_Lng 
.... 

的過程將返回原來的行(ROW1)+所有附近的地方。我正在尋找如何實現這一目標的建議。謝謝。

回答

2

試試這個:

CREATE procedure GetNearbyPlaces 
    @Id int 
AS 
BEGIN 
    Declare @Min_Lat decimal(18, 3) 
    Declare @Min_Lng decimal(18, 3) 
    Declare @Max_Lat decimal(18, 3) 
    Declare @Max_Lng decimal(18, 3) 

    SELECT @Min_Lat=Latitude - 0.005, 
    @Min_Lng=Longitude - 0.005, 
    @Max_Lat=Latitude + 0.005, 
    @Max_Lng=Longitude + 0.005 
    FROM Places 
    WHERE Id = @Id 

    SELECT * 
    FROM Places 
    WHERE Latitude BETWEEN @Min_Lat AND @Max_Lat 
    AND Longitude BETWEEN @Min_Lng AND @Max_Lng 
    ORDER By ID ASC 

END 
GO 

在中東歐在這之後,你可能是具有另一個問題是與DECIMAL(18,2) - 我認爲這需要是DECIMAL(18,3),因爲您使用.005進行抵消。

下面是一個簡單的版本,一個SQL語句:

SELECT P.* 
    FROM Places P 
    JOIN (
     SELECT Latitude - 0.005 Min_Lat, 
     Longitude - 0.005 Min_Lng, 
     Latitude + 0.005 Max_Lat, 
     Longitude + 0.005 Max_Lng 
     FROM Places 
     WHERE Id = @Id 
    ) P2 ON P.Latitude BETWEEN P2.Min_Lat AND P2.Max_Lat 
      AND P.Longitude BETWEEN P2.Min_Lng AND P2.Max_Lng 
    ORDER By ID ASC 
+0

測試中的應用1例。奇蹟般有效。我在小提琴中測試了2個例子,但沒有在應用程序中。它工作在小提琴,所以我期望它在應用程序中工作。感謝** sgeddes **。 –

+0

** sgeddes **,我繼續並將Latitude和Longitude表列更改爲浮點數據類型以獲得更多小數點,從而提高了精度。謝謝 –

+0

@Machua - 很高興你能夠正常工作。親切的問候! – sgeddes

相關問題