我有 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
重新审视这一点后,您可能遇到的另一个问题是 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
关于SQL Server 2008 : Multiple Queries in One Stored Procedure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16766078/