2014-09-12 2 views
2

Я пытаюсь создать хранимую процедуру, которая принимает индекс, где следует начинать, максимальное количество строк для отображения и местоположение. Он возвращает список HouseID и местоположение, но я также хочу, чтобы он включал «имя дома» из другой таблицы под названием dbo.House, которая имеет ссылку HouseId, чтобы связать ее с местоположением. Как мне добавить вторую таблицу.Хранимая процедура SQL Server с ROW_NUMBER

Спасибо,

CREATE PROCEDURE dbo.basicHouseSearch 
    @StartIndex int, 
    @MaxRows int, 
    @HouseLocation NVarChar(50) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    Select 
     Location.HouseID, CityTown 
    FROM 
     (SELECT 
      ROW_NUMBER() OVER (ORDER by Location.HouseID) as RowNumber, 
      Location.HouseID, 
      CityTown 
     FROM dbo.Location) Location 
    WHERE 
     RowNumber >= @StartIndex 
     AND ROWNUMBER < (@StartIndex + @MaxRows) 
END 
GO 
+0

Добавьте соединение в свой подзапрос и добавьте этот столбец в свой внешний запрос. –

+1

Или еще лучше, присоединитесь к результатам подзапроса - никаких гарантий, но может быть лучше при принуждении SQL Server к фильтрации перед присоединением. –

+0

Какая версия Sql Server? Есть новый метод OFFSET/FETCH, который намного лучше подходит для подкачки, как это. –

ответ

3

Я снова написал свой код, чтобы он использует OFFSET/FETCH (я думаю, что это более ясно, что путь):

SELECT L.HouseID, 
     L.CityTown, 
     H.Name [Name of the house] 
FROM dbo.Location L 
LEFT JOIN dbo.House H 
    ON L.HouseID = H.HouseID 
ORDER BY L.HouseID 
OFFSET @StartIndex ROWS FETCH NEXT @MaxRows ONLY 

(Требуется SQL Server 2012 или более поздней версии)

+0

+1, Ницца! Я должен был спросить о версии SQL Server. – Lamak

+0

@JoelCoehoorn Спасибо, но он дает мне ошибку для OFFSET и ТОЛЬКО, говоря неправильный синтаксис возле «OFFSET» и неправильный синтаксис рядом «ТОЛЬКО», ожидающий FROM – Tiber

+0

@ user3043862 Итак, это сервер, на котором эта база данных принадлежит на самом деле SQL Server 2012 ?, и каков уровень совместимости вашей базы данных? – Lamak

3

Я снова написал свой код, чтобы он использует КТР (я думаю, что это более ясно, что путь):

;WITH CTE AS 
(
    SELECT RowNumber = ROW_NUMBER() OVER (ORDER by L.HouseID), 
      L.HouseID, 
      L.CityTown, 
      H.Name [Name of the house] 
    FROM dbo.Location L 
    LEFT JOIN dbo.House H 
     ON L.HouseID = H.HouseID 
) 
SELECT * 
FROM CTE 
WHERE RowNumber >= @StartIndex 
AND RowNumber < (@StartIndex + @MaxRows) 
+0

Эй, я сорвался с вашего ответа за юмористический фактор. Пожалуйста, не принимайте это неправильно: до Sql Server 2012 я думаю, что это правильный ответ. –

+0

@JoelCoehoorn Совсем нет :-). Для версии op ваш ответ лучше, я думаю – Lamak

+0

Также: отредактировал этот, вместо моего собственного по ошибке (откат назад). Это то, что я получаю для копирования/вставки:/ –

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