Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak zrobić stronicowanie dla jqGrid w procedurze składowanej?

Istnieje wiele sposobów na zaimplementowanie STORED PROCEDURE czego potrzebujesz. Na przykład możesz użyć ROW_NUMBER konstrukcja wewnątrz instrukcji CTE SQL.

Jeśli używasz SQL Server 2012, możesz użyć OFFSET i FETCH po ORDER BY zaimplementować paginację (zobacz tutaj ). W przypadku, gdy instrukcja SQL będzie wyglądać bardzo podobnie do odpowiednich instrukcji MySQL lub PostgreSQL, które używają OFFSET i LIMIT . Przy okazji Microsoft Entity Framework używa Entity SQL Language mający zamkniętą konstrukcję (SKIP i LIMIT ). Prawdopodobnie OFFSET i FETCH byłoby preferowanym sposobem, jeśli używasz SQL Server 2012 lub nowszego.

Ponieważ w swoim pytaniu umieściłeś tag SQL Server 2008, nie użyłbym w mojej odpowiedzi nowych konstrukcji SQL Server 2012.

Jeszcze jednym dobrym sposobem byłoby użycie sp_executesql co pozwala na skonstruowanie instrukcji SQL jako ciągu znaków z parametrami. Pozwala na ponowne wykorzystanie planów wykonania, co jest bardzo ważne dla uzyskania najlepszej wydajności. Takie podejście pozwala na rozszerzenie kodu Twojej STORED PROCEDURE zaimplementować filtrowanie po stronie serwera (wyszukiwanie).

Widzę, że trzeba zaimplementować paginację w instrukcji SQL, która zawiera identyfikator zwracanych danych (PersonId w Twoim przypadku). Postanawiam więc zasugerować Ci użycie uproszczonego sposobu, który używa SELECT TOP w połączeniu z LEFT OUTER JOIN .

Ty STORED PROCEDURE dbo.GetExtraPerson może mieć dwa dodatkowe parametry typu int :@skip i @pageSize . W przypadku @skip jest równe 0 STORED PROCEDURE można po prostu wykonać

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

Jeśli @skip nie jest równe 0 wtedy odpowiednia instrukcja SQL może być następująca

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 

Pełny kod dbo.GetExtraPerson może dotyczyć następujących

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

Powyższa procedura dodatkowo zwraca całkowitą liczbę rekordów i możesz jej użyć do przypisania totalRecords wartość.

Jeśli użyjesz powyższego kodu w połączeniu z sp_executesql możesz łatwo zmodyfikować kod, aby zawierał ORDER BY we wszystkich SELECT TOP instrukcji, aby zwracane wartości odpowiadały porządkowi sortowania żądanemu przez użytkownika w jqGrid.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak utworzyć klucz obcy w SQL Server?

  2. Nawiasy klamrowe w T-SQL

  3. order by newid() - jak to działa?

  4. Jak wyodrębnić dane z kolumny xml w sql 2008

  5. SSRS:Jak stworzyć raport JAK tabela przestawna w ssrs 2008 r2