2013-05-27 7 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 первый. Если строка возвращается, приложение принимает данные широты и долготы и вычисляет переменные @max_Lng, @Min_Lng, @Max_Lat и @Max_Long, добавляя или вычитая константу 0,005. Эти переменные передаются в 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 Statement:

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

Испытано первый пример в приложении. Работает как шарм. Я тестировал 2 примера в скрипке, но не в приложении. Он работает в скрипке, поэтому я ожидаю, что он будет работать в приложении. Спасибо ** sgeddes **. –

+0

** sgeddes **, я пошел вперед и изменил столбцы таблицы широты и долготы, чтобы плавать типы данных для более десятичных точек, что позволяет повысить точность. Спасибо –

+0

@Machua - рад, что вы получили его на работу. С уважением! – sgeddes

Смежные вопросы