4

というテーブルからデータを取得する 2 つのストアド プロシージャがありますPlaces。プロシージャは、C# コードによって一度に 1 つずつ呼び出されます。これらはテーブルの列です。

  [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ます。これらの変数は、近くの場所を返す sp に渡され、アプリは元の場所と近くの場所を Google マップに表示します。@Min_Lng@Max_Lat@Max_LongGetNearbyPlaces

これは問題なく動作しますが、データベースへの往復が 2 回あり、あまり効率的ではありません。2つの手順を次のようなもので1つに結合したいと思います

create procedure dbo.GetPlaces
  @ID int
select * from  dbo.Places as Row1
where ID=@ID
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) + 近くのすべての場所を返します。これを達成する方法についての提案を探しています。ありがとう。

4

1 に答える 1