Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm thế nào để phân trang cho jqGrid trong Thủ tục đã lưu trữ?

Có nhiều cách để triển khai STORED PROCEDURE mà bạn cần. Ví dụ:bạn có thể sử dụng ROW_NUMBER xây dựng bên trong câu lệnh SQL CTE.

Nếu bạn sử dụng SQL Server 2012, bạn có thể sử dụng OFFSETFETCH sau ORDER BY để triển khai phân trang (xem tại đây ). Trong trường hợp, câu lệnh SQL trông rất gần với câu lệnh MySQL hoặc PostgreSQL tương ứng sử dụng OFFSETLIMIT . Nhân tiện, Microsoft Entity Framework sử dụng Ngôn ngữ SQL của Thực thể có cấu trúc gần (SKIPLIMIT ). Có thể là OFFSETFETCH sẽ được ưu tiên hơn nếu bạn sử dụng SQL Server 2012 trở lên.

Bởi vì bạn đã bao gồm thẻ SQL Server 2008 trong câu hỏi của mình, tôi sẽ không sử dụng cấu trúc SQL Server 2012 mới trong câu trả lời của mình.

Một cách hay nữa là sử dụng sp_executesql cho phép bạn xây dựng một câu lệnh SQL dưới dạng chuỗi với các tham số. Nó cho phép sử dụng lại các kế hoạch thực thi, điều này rất quan trọng để có hiệu suất tốt nhất. Phương pháp này cho phép bạn mở rộng mã của STORED PROCEDURE của bạn để triển khai lọc phía máy chủ (tìm kiếm).

Tôi thấy rằng cần phải triển khai phân trang trong câu lệnh SQL chứa ID của dữ liệu trả về (PersonId trong trường hợp của bạn). Vì vậy, tôi quyết định đề nghị bạn sử dụng cách đơn giản hóa sử dụng SELECT TOP kết hợp với LEFT OUTER JOIN .

Bạn STORED PROCEDURE dbo.GetExtraPerson có thể có thêm hai tham số kiểu int :@skip@pageSize . Trong trường hợp của @skip bằng 0 STORED PROCEDURE chỉ có thể thực thi

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

Nếu @skip không bằng 0 thì câu lệnh SQL tương ứng có thể như sau

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 

Mã đầy đủ của dbo.GetExtraPerson có thể là về những điều sau

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

Quy trình trên trả về tổng số bản ghi và bạn có thể sử dụng nó để gán totalRecords giá trị.

Nếu bạn sử dụng mã trên kết hợp với sp_executesql bạn có thể dễ dàng sửa đổi mã để bao gồm ORDER BY trong tất cả SELECT TOP sao cho các giá trị trả về sẽ tương ứng với thứ tự sắp xếp do người dùng yêu cầu trong 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. Cách thoát đúng các số nhận dạng được phân tách trong SQL Server mà không sử dụng QUOTENAME

  2. Tìm sự phụ thuộc của cột

  3. MDX Cách tính toán số đo theo thứ nguyên mà không hiển thị các thành viên trong kết quả

  4. Khóa chính trong SQL Server

  5. Thuộc tính đã tạo Subsonic 2.2 cho SQL Server 2008 Ngày