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 example@sqldat.com AND example@sqldat.com 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 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
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 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
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.