OFFSET FETCH in SQL Server 2008

7

Ich habe diese Abfrage, um die Ergebnisse zu paginieren, und sie funktionierte unter SQL Server 2012 einwandfrei. Ich musste jedoch meine Datenbank auf SQL Server 2008 verschieben, und jetzt funktioniert meine gespeicherte Prozedur nicht mehr. Ich habe einige Nachforschungen angestellt und festgestellt, dass OFFSETdies in SQL Server 2008 nicht funktioniert. Welche Alternative sollte ich jetzt verwenden? Wie erreiche ich die gleiche Funktionalität mit SQL Server 2008?

Hier ist meine gespeicherte Prozedur:

CREATE PROCEDURE [dbo].[sp_JobSearch]
    @EnteredKeyword nvarchar(200) = '', 
    @EnteredLocation nvarchar(200) = '',
    @PageNumber INT = 1,
    @PageSize   INT = 40
AS
BEGIN
    SELECT 
        MasterJob.Title, MasterJob.CompanyName, 
        MasterJob.ShortDesc, MasterJob.Url,MasterJob.PostedTime, 
        MasterJob.Location, JobBoard.JobBoardName
    FROM 
        MasterJob 
    LEFT JOIN 
        JobBoard ON MasterJob.JobBoardId = JobBoard.JobBoardId
    WHERE 
        (MasterJob.Title LIKE '%' + @EnteredKeyword + '%')
        AND (MasterJob.Location LIKE '%' + @EnteredLocation + '%')
    ORDER BY 
        [MasterJobId] 
        OFFSET @PageSize * (@PageNumber - 1) ROWS
        FETCH NEXT @PageSize ROWS ONLY;
END
Iman
quelle

Antworten:

12

Verwenden Sie einen Common Table Expression (CTE):

    CREATE PROCEDURE [dbo].[sp_JobSearch]

    @EnteredKeyword nvarchar(200) = '', 
    @EnteredLocation nvarchar(200) = '',
    @PageNumber INT = 1,
    @PageSize   INT = 40

    AS
    BEGIN

    WITH CTE AS
    (
      SELECT 
        ROW_NUMBER() OVER ( ORDER BY [MasterJobId] ) AS RowNum ,
        MasterJob.Title, MasterJob.CompanyName, MasterJob.ShortDesc,      
        MasterJob.Url,MasterJob.PostedTime, MasterJob.Location, JobBoard.JobBoardName  
      FROM MasterJob 
        LEFT JOIN JobBoard ON MasterJob.JobBoardId = JobBoard.JobBoardId
      WHERE 
      (MasterJob.Title LIKE '%' + @EnteredKeyword + '%')
      AND( MasterJob.Location LIKE '%' + @EnteredLocation + '%' )
    )
    SELECT 
      Title, CompanyName, ShortDesc, Url, PostedTime, Location, JobBoardName
    FROM CTE 
    WHERE 
      (RowNum > @PageSize * (@PageNumber - 1) )
      AND 
      (RowNum <= @PageSize * @PageNumber )
    Order By RowNum 

    END
Ardalan Shahgholi
quelle
Genial, einfach genial !!! Genau das, wonach ich suche Danke!
Mark Kram