Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como fazer paginação para jqGrid no procedimento armazenado?


Há muitas maneiras de implementar STORED PROCEDURE que você precisa. Por exemplo, você pode usar ROW_NUMBER construção dentro da instrução SQL CTE.

Se você usa o SQL Server 2012, pode usar OFFSET e FETCH após ORDER BY para implementar a paginação (consulte aqui ). No caso, a instrução SQL será muito parecida com as instruções MySQL ou PostgreSQL correspondentes que usam OFFSET e LIMIT . A propósito, o Microsoft Entity Framework usa Entity SQL Language tendo construção próxima (SKIP e LIMIT ). Provavelmente OFFSET e FETCH seria a maneira preferida se você usasse o SQL Server 2012 ou superior.

Como você incluiu a tag do SQL Server 2008 em sua pergunta, eu não usaria novas construções do SQL Server 2012 na minha resposta.

Mais uma boa maneira seria usar sp_executesql que permite construir uma instrução SQL como string com parâmetros. Permite reutilizar os planos de execução o que é muito importante para o melhor desempenho. A abordagem permite estender o código do seu STORED PROCEDURE para implementar a filtragem do lado do servidor (pesquisa).

Vejo que preciso implementar a paginação na instrução SQL que contém o ID dos dados retornados (PersonId no seu caso). Então eu decido sugerir que você use uma maneira simplificada que use SELECT TOP em combinação com LEFT OUTER JOIN .

Você STORED PROCEDURE dbo.GetExtraPerson pode ter dois parâmetros adicionais do tipo int :@skip e @pageSize . No caso de @skip é igual a 0 o STORED PROCEDURE pode apenas executar
SELECT TOP (@pageSize) PERS.PersonId
    ,PERS.FirstName
    ,PERS.LastName
    ,PERS.MobileNumber
    ,PERS.EmailId
    ,PERS.PersonNumber
    ,E.ExtraPersonId
    ,E.Diabetes
    ,E.BloodPressure
FROM ExtraPerson E  
    INNER JOIN Person PERS ON PERS.PersonId=E.PersonId  
WHERE [email protected] AND [email protected] AND E.IsDeleted=0

Se @skip não é igual a 0 então a instrução SQL correspondente pode ser a seguinte
WITH GetAll AS (
    SELECT PERS.PersonId
        ,PERS.FirstName
        ,PERS.LastName
        ,PERS.MobileNumber
        ,PERS.EmailId
        ,PERS.PersonNumber
        ,E.ExtraPersonId
        ,E.Diabetes
        ,E.BloodPressure
    FROM ExtraPerson E  
        INNER JOIN Person PERS ON PERS.PersonId=E.PersonId  
    WHERE [email protected] AND [email protected] AND E.IsDeleted=0
),GetFirst AS (
    SELECT TOP (@skip) *
    FROM GetAll
    ORDER BY Name
),GetNext AS (
    SELECT TOP (@pageSize) a.*
    FROM GetAll AS a
        LEFT OUTER JOIN GetFirst AS f ON f.Id=a.Id
    WHERE f.Id IS NULL
    ORDER BY Name
)
SELECT * FROM GetNext 

O código completo de dbo.GetExtraPerson pode ser sobre o seguinte
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE dbo.GetExtraPerson 
    @CampId int,
    @ReferencePatientId bigint,
    @skip int,
    @pageSize int
AS
BEGIN
    DECLARE @records int;
    SET NOCOUNT ON;

    SET @records = (SELECT COUNT(*)
                    FROM ExtraPerson E  
                        INNER JOIN Person PERS ON PERS.PersonId=E.PersonId  
                    WHERE [email protected]
                        AND [email protected]
                        AND E.IsDeleted=0);

    IF @skip <= 0
        SELECT TOP (@pageSize) PERS.PersonId
            ,PERS.FirstName
            ,PERS.LastName
            ,PERS.MobileNumber
            ,PERS.EmailId
            ,PERS.PersonNumber
            ,E.ExtraPersonId
            ,E.Diabetes
            ,E.BloodPressure
        FROM ExtraPerson E  
            INNER JOIN Person PERS ON PERS.PersonId=E.PersonId  
        WHERE [email protected] AND [email protected]
            AND E.IsDeleted=0
    ELSE
        WITH GetAll AS (
            SELECT PERS.PersonId
                ,PERS.FirstName
                ,PERS.LastName
                ,PERS.MobileNumber
                ,PERS.EmailId
                ,PERS.PersonNumber
                ,E.ExtraPersonId
                ,E.Diabetes
                ,E.BloodPressure
            FROM ExtraPerson E  
                INNER JOIN Person PERS ON PERS.PersonId=E.PersonId  
            WHERE [email protected] AND [email protected]
                AND E.IsDeleted=0
        ),GetFirst AS (
            SELECT TOP (@skip) *
            FROM GetAll
            ORDER BY Name
        ),GetNext AS (
            SELECT TOP (@pageSize) a.*
            FROM GetAll AS a
                LEFT OUTER JOIN GetFirst AS f ON f.Id=a.Id
            WHERE f.Id IS NULL
            ORDER BY Name
        )
        SELECT * FROM GetNext;

    RETURN @records;
END
GO

O procedimento acima retorna o número total de registros adicionalmente e você pode usá-lo para atribuir totalRecords valor.

Se você usar o código acima em combinação com sp_executesql você pode facilmente modificar o código para incluir ORDER BY em todos os SELECT TOP instruções para que os valores retornados correspondam à ordem de classificação solicitada pelo usuário no jqGrid.