Es gibt viele Möglichkeiten, STORED PROCEDURE zu implementieren die du brauchst. Sie können beispielsweise ROW_NUMBER verwenden Konstruktion innerhalb der CTE-SQL-Anweisung.
Wenn Sie SQL Server 2012 verwenden, können Sie OFFSET verwenden und FETCH nach ORDER BY Paginierung zu implementieren (siehe hier
). ). In diesem Fall wird die SQL-Anweisung den entsprechenden MySQL- oder PostgreSQL-Anweisungen sehr ähnlich sein, die OFFSET verwenden und LIMIT . Übrigens verwendet Microsoft Entity Framework Entity SQL Language
mit engem Konstrukt (SKIP und LIMIT ). Wahrscheinlich OFFSET und FETCH wäre der bevorzugte Weg, wenn Sie SQL Server 2012 oder höher verwenden.
Da Sie das SQL Server 2008-Tag in Ihre Frage aufgenommen haben, würde ich in meiner Antwort keine neuen SQL Server 2012-Konstrukte verwenden.
Eine weitere gute Möglichkeit wäre die Verwendung von sp_executesql wodurch Sie eine SQL-Anweisung als Zeichenfolge mit Parametern erstellen können. Es ermöglicht die Wiederverwendung von Ausführungsplänen, was für die beste Leistung sehr wichtig ist. Der Ansatz ermöglicht es Ihnen, den Code Ihrer STORED PROCEDURE zu erweitern um eine serverseitige Filterung (Suche) zu implementieren.
Ich sehe, dass die Paginierung in der SQL-Anweisung implementiert werden muss, die die ID der zurückgegebenen Daten enthält (PersonId in Ihrem Fall). Daher beschließe ich, Ihnen vorzuschlagen, die vereinfachte Methode zu verwenden, die SELECT TOP verwendet in Kombination mit LEFT OUTER JOIN .
Sie STORED PROCEDURE dbo.GetExtraPerson kann zwei zusätzliche Parameter vom Typ int haben :@skip und @pageSize . Bei @skip ist gleich 0 die STORED PROCEDURE kann einfach ausgeführt werden
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
Wenn @skip ist ungleich 0 dann kann die entsprechende SQL-Anweisung die folgende sein
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
Der vollständige Code von dbo.GetExtraPerson könnte etwa Folgendes sein
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
Die obige Prozedur gibt zusätzlich die Gesamtzahl der Datensätze zurück und Sie können damit totalRecords zuweisen Wert.
Wenn Sie den obigen Code in Kombination mit sp_executesql verwenden würden Sie können den Code einfach so ändern, dass er ORDER BY enthält in allen SELECT TOP Anweisungen, sodass die zurückgegebenen Werte der vom Benutzer in jqGrid angeforderten Sortierreihenfolge entsprechen.