Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana cara melakukan Paging untuk jqGrid di Stored Procedure?

Ada banyak cara untuk menerapkan STORED PROCEDURE yang Anda butuhkan. Misalnya Anda dapat menggunakan ROW_NUMBER konstruksi di dalam pernyataan CTE SQL.

Jika Anda menggunakan SQL Server 2012 Anda dapat menggunakan OFFSET dan FETCH setelah ORDER BY untuk menerapkan pagination (lihat di sini ). Jika pernyataan SQL akan terlihat sangat dekat dengan pernyataan MySQL atau PostgreSQL yang sesuai yang menggunakan OFFSET dan LIMIT . Omong-omong Microsoft Entity Framework menggunakan Bahasa SQL Entitas memiliki konstruksi yang dekat (SKIP dan LIMIT ). Mungkin OFFSET dan FETCH akan lebih disukai jika Anda menggunakan SQL Server 2012 atau lebih tinggi.

Karena Anda menyertakan tag SQL Server 2008 dalam pertanyaan Anda, saya tidak akan menggunakan konstruksi SQL Server 2012 baru dalam jawaban saya.

Satu lagi cara yang baik adalah dengan menggunakan sp_executesql yang memungkinkan Anda membuat pernyataan SQL sebagai string dengan parameter. Hal ini memungkinkan untuk menggunakan kembali rencana eksekusi yang sangat penting untuk kinerja terbaik. Pendekatan ini memungkinkan Anda untuk memperluas kode STORED PROCEDURE untuk menerapkan pemfilteran sisi server (pencarian).

Saya melihat kebutuhan untuk mengimplementasikan pagination dalam pernyataan SQL yang berisi ID dari data yang dikembalikan (PersonId dalam kasus Anda). Jadi saya memutuskan untuk menyarankan Anda untuk menggunakan cara yang disederhanakan yang menggunakan SELECT TOP dalam kombinasi dengan LEFT OUTER JOIN .

Anda STORED PROCEDURE dbo.GetExtraPerson dapat memiliki dua parameter tambahan bertipe int :@skip dan @pageSize . Dalam kasus @skip sama dengan 0 STORED PROCEDURE hanya bisa mengeksekusi

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

Jika @skip tidak sama dengan 0 maka pernyataan SQL yang sesuai dapat menjadi sebagai berikut

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 

Kode lengkap dbo.GetExtraPerson bisa tentang berikut

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

Prosedur di atas mengembalikan jumlah total catatan tambahan dan Anda dapat menggunakannya untuk menetapkan totalRecords nilai.

Jika Anda akan menggunakan kode di atas dalam kombinasi dengan sp_executesql Anda dapat dengan mudah memodifikasi kode untuk memasukkan ORDER BY di semua SELECT TOP pernyataan sehingga nilai yang dikembalikan akan sesuai dengan urutan pengurutan yang diminta oleh pengguna di 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. Cara menggabungkan variabel menjadi string SQL

  2. Cara Mengembalikan Kepercayaan dalam Batasan Kunci Asing di SQL Server (Contoh T-SQL)

  3. Bisakah saya menyimpan 'Objek' di database SQL Server?

  4. Lihat Riwayat Pekerjaan Agen SQL Server dengan Azure Data Studio

  5. Berikan izin tingkat tabel di SQL Server