sql >> Databáze >  >> RDS >> Sqlserver

Jak provést stránkování pro jqGrid v uložené proceduře?

Existuje mnoho způsobů, jak implementovat STORED PROCEDURE které potřebujete. Můžete například použít ROW_NUMBER konstrukce uvnitř příkazu CTE SQL.

Pokud používáte SQL Server 2012, můžete použít OFFSET a FETCH po ORDER BY implementovat stránkování (viz zde ). V případě, že SQL příkaz bude vypadat velmi blízko odpovídajícím MySQL nebo PostgreSQL příkazům, které používají OFFSET a LIMIT . Mimochodem Microsoft Entity Framework používá Entity SQL Language s uzavřenou konstrukcí (SKIP a LIMIT ). Pravděpodobně OFFSET a FETCH by byl preferovaný způsob, pokud používáte SQL Server 2012 nebo vyšší.

Protože jste do své otázky zahrnuli značku SQL Server 2008, nepoužil bych ve své odpovědi nové konstrukce SQL Server 2012.

Dalším dobrým způsobem by bylo použít sp_executesql což umožňuje sestavit SQL příkaz jako řetězec s parametry. Umožňuje znovu použít prováděcí plány, což je velmi důležité pro nejlepší výkon. Tento přístup vám umožňuje rozšířit kód vaší STORED PROCEDURE implementovat filtrování na straně serveru (vyhledávání).

Vidím, že je třeba implementovat stránkování v příkazu SQL, který obsahuje ID vrácených dat (PersonId ve vašem případě). Proto jsem se rozhodl navrhnout, abyste použili zjednodušený způsob, který používá SELECT TOP v kombinaci s LEFT OUTER JOIN .

STORED PROCEDURE dbo.GetExtraPerson může mít dva další parametry typu int :@skip a @pageSize . V případě @skip se rovná 0 STORED PROCEDURE stačí spustit

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

Pokud @skip se nerovná 0 pak může být odpovídající příkaz SQL následující

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 

Úplný kód dbo.GetExtraPerson může být o následujícím

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

Výše uvedený postup navíc vrátí celkový počet záznamů a můžete jej použít k přiřazení totalRecords hodnotu.

Pokud byste použili výše uvedený kód v kombinaci s sp_executesql kód můžete snadno upravit tak, aby obsahoval ORDER BY ve všech SELECT TOP tak, že vrácené hodnoty budou odpovídat pořadí řazení požadovaném uživatelem v jqGrid.




  1. Zahoďte milisekundovou část z časového razítka

  2. Proč funkce PostgreSQL json_agg() nevrací prázdné pole?

  3. mkdir /mnt/data:souborový systém pouze pro čtení Zpětné restartování se nezdařilo postgres kontejneru

  4. Jak nastavit vlastnosti připojení (includeSynonyms)