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 [email protected] AND [email protected] 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 [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
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 [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
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.