SQL Server 2008 : Multiple Queries in One Stored Procedure

标签 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第一的。如果返回一行,应用程序将获取经纬度数据并计算 @max_Lng , @Min_Lng , @Max_Lat@Max_Long变量通过添加或减去常数 0.005。这些变量被传递给 GetNearbyPlaces sp 返回附近地点,应用程序在 Google map 上显示原始地点和附近地点。

这工作正常,但有两次到数据库的往返,效率不高。
我想将这两个程序合二为一
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) + 所有附近的地方。我正在寻找有关如何实现这一目标的建议。谢谢。

最佳答案

试试这个:

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
  • SQL Fiddle Demo


  • 重新审视这一点后,您可能遇到的另一个问题是 DECIMAL(18,2)——我认为这需要是 DECIMAL(18,3),因为您用 0.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
    
  • Updated Fiddle
  • 关于SQL Server 2008 : Multiple Queries in One Stored Procedure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16766078/

    相关文章:

    asp.net - 偶发的 ASP.NET 数据错误 : "Cannot find table 0"

    sql-server - 使用 SQL 获取父/子数据库中每个 ID 的相关数据

    sql - 获取Oracle中所有表的列表?

    mysql - SQL 查询总和乘以 2 倍应该是多少

    sql - 如何编写查询以在不指定每个列名称的情况下用逗号分隔每个列

    sql - 一切的 DDL 触发器

    sql - 使用 SP_ExecuteSQL 时返回 NULL 数据值

    php - 正确的mysql查询来查询一个表并为另一个表查询提供信息

    mysql - MySql Inner Join 的问题 > 未包含在聚合函数或 GROUP BY 子句中

    sql - Rails ActiveRecord where 子句