SQL Server 2008:一个存储过程中的多个查询

时间:2013-05-27 03:53:39

标签: sql sql-server

我有2个存储过程从名为Places的表中检索数据。这些过程一次由C#代码调用。这些是表格列。

  [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 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)+所有附近的地方。我正在寻找有关如何实现这一目标的建议。感谢。

1 个答案:

答案 0 :(得分:3)

尝试一下:

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