sql >> データベース >  >> RDS >> Sqlserver

ストアドプロシージャでjqGridのページングを行う方法は?

    STORED PROCEDURE を実装する方法はたくさんあります あなたが必要とするもの。たとえば、ROW_NUMBER を使用できます CTE SQL ステートメント内の構造。

    SQL Server 2012 を使用している場合は、OFFSET を使用できます そして FETCH ORDER BY の後 ページネーションを実装する (こちら を参照) )。この場合、SQL ステートメントは、OFFSET を使用する対応する MySQL または PostgreSQL ステートメントに非常に似ています。 と LIMIT .ところで、Microsoft Entity Framework は Entity SQL Language を使用します 近い構文を持つ (SKIPLIMIT )。おそらく 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 [email protected] AND [email protected] 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 [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 
    

    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 [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
    

    上記の手順はさらにレコードの総数を返し、それを使用して totalRecords を割り当てることができます

    上記のコードを sp_executesql と組み合わせて使用​​する場合 コードを簡単に変更して ORDER BY を含めることができます すべての SELECT TOP で 返される値が、jqGrid でユーザーが要求した並べ替え順序に対応するようにステートメントを作成します。




    1. ルールを使用してセカンダリテーブルに自動インクリメントシーケンスを挿入する

    2. システムで生成された名前を持つPK制約を削除するSQLServer2008スクリプト

    3. PHPのNULLチェック

    4. mysqlフィールドタイプをINTからVARCHARに変更すると、以前にINTとして保存されたデータにどのように影響しますか