SQLServerのは、効率的なページングストアドプロシージャ

/ ************************************************* *********************
パラメータ:ページごとに表示するのPageSizeレコード@ SqlStr SQL文@ [並べ替えのソートフィールド@ @PrimaryKey主キー、、、、pageIndexパラメータ@このページ(開始0)
********************************************** ************************************************************ /
ALTER手順[DBO] [PageQuery]。
@PrimaryKey VARCHAR(100)、 -主キー
@OrderByのVARCHAR(100 )、 -ソートフィールドの
@SqlStrのVARCHAR(8000)、 - SQLステートメント
@PageSize int型、 -ページあたりに表示するレコード
このページint-- @PageIndex()1から始まる
-のRecordCount出力はint @ -リターン合計レコードは
AS
@ExecSql VARCHAR(8000)を宣言- SQLの組み合わせを実行するために
IFのOrderBy @ = ''
'のPrimaryKey @ + + 'ASC'でSET =のOrderBy @'注文
他のIF(LEN(@OrderBy)<上位8か。 (サブストリング(並べ替え基準@、1,8))<> 'によりORDER')
SET = [並べ替え@ '「+ @ [並べ替え順
もし@がPageSize = -1--用于AJAX的第一次查询
設定@がPageSize = 0
に設定@ pageIndexパラメータ= @ pageIndexパラメータ-1
プリント( '-----' + CAST(@PageIndexとしてはvarchar(10)))
始める
@recordCount int型、@ PAGECOUNT int型宣言
@sのnvarchar(4000)を宣言
@s = N'select @recordCount =カウントを設定します( '+ @主キー+')( '+ @ SqlStr +')TN」から
のexec sp_executesqlをする@ S、N RecordCountを出力@ '@recordCount INT出力'、
(@pageSize> 0)であれば
@pageCount =(@recordCount - 1 + @PageSize)設定/ @PageSize; -总页数

@pageCount = 0に設定; -总页数

    if @PageIndex<=0--如果是第一页就执行这个
        begin
            set @ExecSql='select top '+cast(@PageSize as varchar(100))+' * from ('+@SqlStr+') T '+@OrderBy
        end
    else
        begin
            if charindex('2000 - 8.00.',@@version)>0
                begin
                    set @ExecSql=
                    'select top '+cast(@PageSize as varchar(100))+' *
                    from ('+@SqlStr+') as T where T.'+@PrimaryKey+' not in
                    (select top '+cast((@PageSize*@PageIndex) as varchar(100))+' '+@PrimaryKey+'
                        from ('+@SqlStr+') T2 '+@OrderBy+') '+ @OrderBy
                end
            else
                begin
                    set @ExecSql=
                    'select * from
                    (
                        select * from
                        (SELECT *, #RowNum#=ROW_NUMBER() OVER('+@OrderBy+') FROM ('+@SqlStr+') T1) T2 where T2.#RowNum#>='+cast(@PageSize*@PageIndex+1 as varchar(10))+' and T2.#RowNum#<='+cast(@PageSize*(@PageIndex+1) as varchar(10))+'
                    ) T3
                    '
                end
        end
        exec (@ExecSql+' select '+@recordCount+' as RecordCount,'+@pageCount+' as PageCount ')

終わり

おすすめ

転載: www.cnblogs.com/Yann123/p/11711172.html