2013-03-28 4 views
4

У меня есть хранимая процедура, которая возвращает результат из двух таблиц с использованием внешнего соединения и где условия. Он также имеет порядок по статье. Я хочу добавить пейджинг к нему, чтобы вернуть только запрошенное количество записей. Как мне это сделать? Мне нужно указать pagenumber, totalnumber записей, текущую страницу и т. Д.? Моя хранимая процедура:Пейджинг записей с использованием хранимой процедуры SQL Server

CREATE PROCEDURE [dbo].[hr_SearchVacanciesForService] 

    @SearchText NVARCHAR(50) = NULL, 
    @DutyStationID INT = NULL, 
    @VacancyCategoryIDs VARCHAR(1000) = NULL, 
    @Language INT = 1 
AS 

SELECT * 
FROM dbo.hr_Vacancies LEFT OUTER JOIN dbo.hr_DutyStations ON dbo.hr_Vacancies.DutyStationID = dbo.hr_DutyStations.DutyStationID 
    LEFT OUTER JOIN dbo.hr_Companies  
     ON dbo.hr_Vacancies.CompanyID = dbo.hr_Companies.CompanyID 
WHERE dbo.hr_Vacancies.Deleted = 0 
     AND (dbo.hr_Vacancies.JobTitleLang1 LIKE @LoacalSeacrchText 
     OR dbo.hr_Vacancies.JobTitleLang2 LIKE @LoacalSeacrchText 
     OR dbo.hr_Vacancies.DescriptionLang1 LIKE @LoacalSeacrchText 
     OR dbo.hr_Vacancies.DescriptionLang2 LIKE @LoacalSeacrchText  
    AND (dbo.hr_Vacancies.DutyStationID = @DutyStationID OR @DutyStationID IS NULL OR @DutyStationID = 0) 
    ORDER BY HavePriority DESC, StartDate DESC, dbo.hr_Vacancies.VacancyID DESC 
+0

Посмотрите здесь: http://www.codeproject.com/Articles/6936/Paging-of-Large-Resultsets-in-A SP-NET. – dee

ответ

7

Используйте вариант с CTE и OVER() пункт

CREATE PROCEDURE [dbo].[hr_SearchVacanciesForService] 
@SearchText NVARCHAR(50) = NULL, 
@DutyStationID INT = NULL, 
@VacancyCategoryIDs VARCHAR(1000) = NULL, 
@Language INT = 1, 
@NumberOfPages int 
AS 
;WITH cte AS 
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY HavePriority DESC, StartDate DESC, dbo.hr_Vacancies.VacancyID DESC) AS Pages 
    FROM dbo.hr_Vacancies LEFT OUTER JOIN dbo.hr_DutyStations ON dbo.hr_Vacancies.DutyStationID = dbo.hr_DutyStations.DutyStationID 
         LEFT OUTER JOIN dbo.hr_Companies ON dbo.hr_Vacancies.CompanyID = dbo.hr_Companies.CompanyID 
    WHERE dbo.hr_Vacancies.Deleted = 0 
    AND (dbo.hr_Vacancies.JobTitleLang1 LIKE @LoacalSeacrchText 
    OR dbo.hr_Vacancies.JobTitleLang2 LIKE @LoacalSeacrchText 
    OR dbo.hr_Vacancies.DescriptionLang1 LIKE @LoacalSeacrchText 
    OR dbo.hr_Vacancies.DescriptionLang2 LIKE @LoacalSeacrchText  
    AND (dbo.hr_Vacancies.DutyStationID = @DutyStationID OR @DutyStationID IS NULL OR @DutyStationID = 0) 
) 
    SELECT *, COUNT(*) OVER() AS totalOfPages 
    FROM cte 
    WHERE Pages BETWEEN 1 AND ISNULL(@NumberOfPages, Pages) 

Пример использования OVER() положение с выражениями:

SELECT ... ROW_NUMBER() OVER (ORDER BY 
CASE WHEN dbo.hr_Vacancies.Priority = 0 
    THEN 0 ELSE 
CASE WHEN CONVERT(DATETIME,CONVERT(CHAR(10),dbo.hr_Vacancies.PriorityDateExpired,101)) > CONVERT(DATETIME,CONVERT(CHAR(10),GETDATE(),101)) OR dbo.hr_Vacancies.PriorityDateExpired IS NULL 
    THEN 1 ELSE 0 END END DESC, your_second_expression_StartDate DESC) 

Если вы хотите, чтобы показать записи из 20 до 30:

CREATE PROCEDURE [dbo].[hr_SearchVacanciesForService] 

    @SearchText NVARCHAR(50) = NULL, 
    @DutyStationID INT = NULL, 
    @VacancyCategoryIDs VARCHAR(1000) = NULL, 
    @Language INT = 1, 
    @StartPage int = NULL, 
    @EndPage int = NULL 
AS 
;WITH cte AS 
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY your_case_expressionForColumnHavePriority DESC, your_case_expressionForColumnStartDate DESC, dbo.hr_Vacancies.VacancyID DESC) AS Pages 
    FROM dbo.hr_Vacancies LEFT OUTER JOIN dbo.hr_DutyStations ON dbo.hr_Vacancies.DutyStationID = dbo.hr_DutyStations.DutyStationID 
         LEFT OUTER JOIN dbo.hr_Companies ON dbo.hr_Vacancies.CompanyID = dbo.hr_Companies.CompanyID 
    WHERE dbo.hr_Vacancies.Deleted = 0 
      AND (dbo.hr_Vacancies.JobTitleLang1 LIKE @LoacalSeacrchText 
      OR dbo.hr_Vacancies.JobTitleLang2 LIKE @LoacalSeacrchText 
      OR dbo.hr_Vacancies.DescriptionLang1 LIKE @LoacalSeacrchText 
      OR dbo.hr_Vacancies.DescriptionLang2 LIKE @LoacalSeacrchText  
     AND (dbo.hr_Vacancies.DutyStationID = @DutyStationID OR @DutyStationID IS NULL OR @DutyStationID = 0) 
) 
    SELECT *, COUNT(*) OVER() AS totalOfPages 
    FROM cte 
    WHERE Pages BETWEEN ISNULL(@StartPage, Pages) AND ISNULL(@EndPage, Pages) 
+0

Спасибо за ваш ответ. Что делать, если мне нужно выбрать несколько столбцов, а не * как 15 столбцов, нужно ли повторять в обоих вариантах? внутри с и после? – DotnetSparrow

+0

Нет только в первом операторе SELECT. –

+0

Это дает ошибку в отношении прав доступа:; WITH cte AS ( SELECT \t ROW_NUMBER() OVER (ORDER BY HavePriority DESC, StartDate DESC, dbo.hr_Vacancies.VacancyID DESC) AS Pages, ... error is Msg 207, Level 16, Состояние 1, Процедура hr_SearchVacanciesForService, строка 33 Недопустимое имя столбца 'HavePriority' .. где, как этот столбец существует – DotnetSparrow

0

Простой Pagination сценарий с (предел, направление заказа, колонки заказа, начальный индекс)

@orderColumn int , 
@orderDir varchar(20), 
@start int , 
@limit int, 
@searchKey varchar(20) 

declare @to as int = @[email protected] 

select IDENTITY(int, 1, 1) AS SnoID,null as abc, make.link,make.manf,make.name 
into #tempMake 
from make where status=1 and UPPER(make.name) like upper('%'[email protected]+'%') 


select * from #tempMake where SnoID>@start and SnoID<[email protected] 
    order by    
       CASE WHEN @orderColumn = 1 AND @orderdir = 'desc' THEN #tempMake.[manf] END DESC, 
       CASE WHEN @orderColumn = 1 AND @orderdir = 'asc' THEN #tempMake.[manf] END ASC, 
       CASE WHEN @orderColumn = 2 AND @orderdir = 'desc' THEN #tempMake.[link] END DESC, 
       CASE WHEN @orderColumn = 2 AND @orderdir = 'asc' THEN #tempMake.[link] END ASC 

select count(#tempMake.SnoID) as row_count from #tempMake 

drop table #tempMake 
Смежные вопросы