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 OFFSET và FETCH 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 OFFSET và LIMIT . 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 (SKIP và LIMIT ). Có thể là OFFSET và FETCH 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 và @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 example@sqldat.com AND example@sqldat.com 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 example@sqldat.com AND example@sqldat.com 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 example@sqldat.com
AND example@sqldat.com
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 example@sqldat.com AND example@sqldat.com
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 example@sqldat.com AND example@sqldat.com
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.