sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan laver man Paging for jqGrid i Stored Procedure?

Der er mange måder at implementere STORED PROCEDURE på som du har brug for. For eksempel kan du bruge ROW_NUMBER konstruktion inde i CTE SQL-sætning.

Hvis du bruger SQL Server 2012, kan du bruge OFFSET og FETCH efter ORDER BY for at implementere paginering (se her ). I det tilfælde vil SQL-sætningen se meget tæt på de tilsvarende MySQL- eller PostgreSQL-sætninger, som bruger OFFSET og LIMIT . Microsoft Entity Framework bruger i øvrigt Entity SQL Language med tæt konstruktion (SKIP og LIMIT ). Sandsynligvis OFFSET og FETCH ville være den foretrukne måde, hvis du bruger SQL Server 2012 eller højere.

Fordi du inkluderede SQL Server 2008-tag i dit spørgsmål, ville jeg ikke bruge nye SQL Server 2012-konstruktioner i mit svar.

En anden god måde ville være at bruge sp_executesql som giver dig mulighed for at konstruere en SQL-sætning som streng med parametre. Det giver mulighed for at genbruge eksekveringsplaner, hvilket er meget vigtigt for den bedste ydeevne. Fremgangsmåden giver dig mulighed for at udvide koden for din STORED PROCEDURE at implementere serversidefiltrering (søgning).

Jeg ser, at det er nødvendigt at implementere paginering i SQL-sætningen, som indeholder ID for de returnerede data (PersonId i dit tilfælde). Så jeg beslutter mig for at foreslå dig at bruge en forenklet måde som bruger SELECT TOP i kombination med LEFT OUTER JOIN .

Du STORED PROCEDURE dbo.GetExtraPerson kan have to yderligere parametre af typen int :@skip og @pageSize . I tilfælde af @skip er lig med 0 den STORED PROCEDURE kan bare udføre

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

Hvis @skip er ikke lig med 0 så kan den tilsvarende SQL-sætning være følgende

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 

Den fulde kode for dbo.GetExtraPerson kunne handle om følgende

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

Proceduren ovenfor returnerer det samlede antal poster yderligere, og du kan bruge den til at tildele totalRecords værdi.

Hvis du vil bruge ovenstående kode i kombination med sp_executesql du kan nemt ændre koden til at inkludere ORDER BY i alt SELECT TOP sætninger, så de returnerede værdier svarer til den sorteringsrækkefølge, brugeren anmoder om i jqGrid.




  1. En generel enkelt sql-forespørgsel

  2. Hvorfor får jeg 'Binær logning ikke mulig.' på min MySQL-server?

  3. Sådan repræsenterer du datoer med usikkerhed i PostgreSQL

  4. På grund af syntaksfejl oprettes tabel ikke i DB