STORED PROCEDURE を実装する方法はたくさんあります あなたが必要とするもの。たとえば、ROW_NUMBER を使用できます CTE SQL ステートメント内の構造。
SQL Server 2012 を使用している場合は、OFFSET を使用できます そして FETCH ORDER BY の後 ページネーションを実装する (こちら
を参照) )。この場合、SQL ステートメントは、OFFSET を使用する対応する MySQL または PostgreSQL ステートメントに非常に似ています。 と LIMIT .ところで、Microsoft Entity Framework は Entity SQL Language
を使用します 近い構文を持つ (SKIP と LIMIT )。おそらく OFFSET そして FETCH SQL Server 2012 以降を使用する場合は、この方法をお勧めします。
質問に SQL Server 2008 タグが含まれているため、回答では新しい SQL Server 2012 構成要素を使用しません。
もう 1 つの良い方法は、sp_executesql を使用することです。 これにより、SQL ステートメントをパラメーター付きの文字列として構築できます。最高のパフォーマンスを得るために非常に重要な実行計画を再利用できます。このアプローチにより、 STORED PROCEDURE のコードを拡張できます サーバー側のフィルタリング (検索) を実装します。
返されたデータの ID (PersonId) を含む SQL ステートメントにページネーションを実装する必要があることがわかりました。 あなたの場合)。そこで、SELECT TOP を使用する簡単な方法を使用することをお勧めします。 LEFT OUTER JOIN と組み合わせて .
STORED PROCEDURE dbo.GetExtraPerson タイプ int の 2 つの追加パラメータを持つことができます :@skip および @pageSize . @skipの場合 0 に等しい STORED PROCEDURE 実行できます
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
If @skip 0 と等しくありません 対応する SQL ステートメントは次のようになります
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
dbo.GetExtraPerson の完全なコード 次のようなことが考えられます
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
上記の手順はさらにレコードの総数を返し、それを使用して totalRecords を割り当てることができます
上記のコードを sp_executesql と組み合わせて使用する場合 コードを簡単に変更して ORDER BY を含めることができます すべての SELECT TOP で 返される値が、jqGrid でユーザーが要求した並べ替え順序に対応するようにステートメントを作成します。