sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo hacer paginación para jqGrid en procedimiento almacenado?

Hay muchas formas de implementar STORED PROCEDURE que necesitas Por ejemplo, puede usar ROW_NUMBER construcción dentro de la declaración CTE SQL.

Si usa SQL Server 2012, puede usar OFFSET y FETCH después de ORDER BY para implementar la paginación (ver aquí ). En el caso, la instrucción SQL se parecerá mucho a las instrucciones MySQL o PostgreSQL correspondientes que usan OFFSET y LIMIT . Por cierto, Microsoft Entity Framework usa Entity SQL Language tener una construcción cercana (SKIP y LIMIT ). Probablemente OFFSET y FETCH sería la forma preferida si usa SQL Server 2012 o superior.

Debido a que incluyó la etiqueta de SQL Server 2008 en su pregunta, no usaría nuevas construcciones de SQL Server 2012 en mi respuesta.

Otra buena manera sería usar sp_executesql que le permite construir una declaración SQL como una cadena con parámetros. Permite reutilizar planes de ejecución lo cual es muy importante para el mejor desempeño. El enfoque le permite extender el código de su STORED PROCEDURE para implementar el filtrado del lado del servidor (búsqueda).

Veo que es necesario implementar la paginación en la instrucción SQL que contiene el ID de los datos devueltos (PersonId en tu caso). Así que decido sugerirle que use una forma simplificada que use SELECT TOP en combinación con LEFT OUTER JOIN .

Usted STORED PROCEDURE dbo.GetExtraPerson puede tener dos parámetros adicionales de tipo int :@skip y @pageSize . En caso de @skip es igual a 0 el STORED PROCEDURE solo puede ejecutar

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

Si @skip no es igual a 0 entonces la instrucción SQL correspondiente puede ser la siguiente

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 

El código completo de dbo.GetExtraPerson podría tratarse de lo siguiente

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

El procedimiento anterior devuelve el número total de registros adicionalmente y puede usarlo para asignar totalRecords valor.

Si usara el código anterior en combinación con sp_executesql puede modificar fácilmente el código para incluir ORDER BY en todos SELECT TOP declaraciones para que los valores devueltos correspondan al orden de clasificación solicitado por el usuario en jqGrid.