ASP.NET 高效分页存储过程 测试通过


这是一个相对高效的分页存储过程,已经测试过了!
程序代码:
代码
CreatePROCEDURE[dbo].[proc_ListPage]
(
@tblNamenvarchar(200),----要显示的表或多个表的连接
@fldNamenvarchar(500)='*',----要显示的字段列表
@pageSizeint=1,----每页显示的记录个数
@pageint=10,----要显示那一页的记录
@pageCountint=1output,----查询结果分页后的总页数
@Countsint=1output,----查询到的记录数
@fldSortnvarchar(200)=null,----排序字段列表或条件
@Sortbit=1,----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:'SortAAsc,SortBDesc,SortC')
@strConditionnvarchar(1000)=null,----查询条件,不需where
@IDnvarchar(150),----主表的主键
@Distbit=0----是否添加查询字段的DISTINCT默认0不添加/1添加
)
AS
SETNOCOUNTON
Declare@sqlTmpnvarchar(1000)----存放动态生成的SQL语句
Declare@strTmpnvarchar(1000)----存放取得查询结果总数的查询语句
Declare@strIDnvarchar(1000)----存放取得查询开头或结尾ID的查询语句

Declare@strSortTypenvarchar(10)----数据排序规则A
Declare@strFSortTypenvarchar(10)----数据排序规则B

Declare@SqlSelectnvarchar(50)----对含有DISTINCT的查询进行SQL构造
Declare@SqlCountsnvarchar(50)----对含有DISTINCT的总数查询进行SQL构造


if@Dist=0
begin
set@SqlSelect='select'
set@SqlCounts='Count(*)'
end
else
begin
set@SqlSelect='selectdistinct'
set@SqlCounts='Count(DISTINCT'+@ID+')'
end


if@Sort=0
begin
set@strFSortType='ASC'
set@strSortType='DESC'
end
else
begin
set@strFSortType='DESC'
set@strSortType='ASC'
end



--------生成查询语句--------
--
此处@strTmp为取得查询结果数量的语句
if@strConditionisnullor@strCondition=''--没有设置显示条件
begin
set@sqlTmp=@fldName+'From'+@tblName
set@strTmp=@SqlSelect+'@Counts='+@SqlCounts+'FROM'+@tblName
set@strID='From'+@tblName
end
else
begin
set@sqlTmp=+@fldName+'From'+@tblName+'where(1>0)'+@strCondition
set@strTmp=@SqlSelect+'@Counts='+@SqlCounts+'FROM'+@tblName+'where(1>0)'+@strCondition
set@strID='From'+@tblName+'where(1>0)'+@strCondition
end

----取得查询结果总数量-----
execsp_executesql@strTmp,N'@Countsintout',@Countsout
declare@tmpCountsint
if@Counts=0
set@tmpCounts=1
else
set@tmpCounts=@Counts

--取得分页总数
set@pageCount=(@tmpCounts+@pageSize-1)/@pageSize

/**//**当前页大于总页数取最后一页**/
if@page>@pageCount
set@page=@pageCount

--/*-----数据分页2分处理-------*/
declare@pageIndexint--总数/页大小
declare@lastcountint--总数%页大小

set@pageIndex=@tmpCounts/@pageSize
set@lastcount=@tmpCounts%@pageSize
if@lastcount>0
set@pageIndex=@pageIndex+1
else
set@lastcount=@pagesize

--//***显示分页
if@strConditionisnullor@strCondition=''--没有设置显示条件
begin
if@pageIndex<2or@page<=@pageIndex/2+@pageIndex%2--前半部分数据处理
begin
set@strTmp=@SqlSelect+'top'+CAST(@pageSizeasVARCHAR(4))+''+@fldName+'from'+@tblName
+'where'+@ID+'notin('+@SqlSelect+'top'+CAST(@pageSize*(@page-1)asVarchar(20))+''+@ID+'from'+@tblName
+'orderby'+@fldSort+''+@strFSortType+')'
+'orderby'+@fldSort+''+@strFSortType
end
else
begin
set@page=@pageIndex-@page+1--后半部分数据处理
if@page<=1--最后一页数据显示
set@strTmp=@SqlSelect+'*from('+@SqlSelect+'top'+CAST(@lastcountasVARCHAR(4))+''+@fldName+'from'+@tblName
+'orderby'+@fldSort+''+@strSortType+')ASTempTB'+'orderby'+@fldSort+''+@strFSortType
else
set@strTmp=@SqlSelect+'*from('+@SqlSelect+'top'+CAST(@pageSizeasVARCHAR(4))+''+@fldName+'from'+@tblName
+'where'+@ID+'notin('+@SqlSelect+'top'+CAST(@pageSize*(@page-2)+@lastcountasVarchar(20))+''+@ID+'from'+@tblName
+'orderby'+@fldSort+''+@strSortType+')'

+'orderby'+@fldSort+''+@strSortType+')ASTempTB'+'orderby'+@fldSort+''+@strFSortType
end
end

else--有查询条件
begin
if@pageIndex<2or@page<=@pageIndex/2+@pageIndex%2--前半部分数据处理
begin
set@strTmp=@SqlSelect+'top'+CAST(@pageSizeasVARCHAR(4))+''+@fldName+'from'+@tblName
+'where'+@ID+'notin('+@SqlSelect+'top'+CAST(@pageSize*(@page-1)asVarchar(20))+''+@ID+'from'+@tblName
+'Where(1>0)'+@strCondition+'orderby'+@fldSort+''+@strFSortType+')'
+''+@strCondition+'orderby'+@fldSort+''+@strFSortType
end
else
begin
set@page=@pageIndex-@page+1--后半部分数据处理
if@page<=1--最后一页数据显示
set@strTmp=@SqlSelect+'*from('+@SqlSelect+'top'+CAST(@lastcountasVARCHAR(4))+''+@fldName+'from'+@tblName
+'where(1>0)'+@strCondition+'orderby'+@fldSort+''+@strSortType+')ASTempTB'+'orderby'+@fldSort+''+@strFSortType
else
set@strTmp=@SqlSelect+'*from('+@SqlSelect+'top'+CAST(@pageSizeasVARCHAR(4))+''+@fldName+'from'+@tblName
+'where'+@ID+'notin('+@SqlSelect+'top'+CAST(@pageSize*(@page-2)+@lastcountasVarchar(20))+''+@ID+'from'+@tblName
+'where(1>0)'+@strCondition+'orderby'+@fldSort+''+@strSortType+')'
+@strCondition+'orderby'+@fldSort+''+@strSortType+')ASTempTB'+'orderby'+@fldSort+''+@strFSortType
end
end

------返回查询结果-----
execsp_executesql@strTmp
--print@strTmp
SETNOCOUNTOFF

优质内容筛选与推荐>>
1、mysql 分表
2、BZOJ 2429: [HAOI2006]聪明的猴子 MST
3、Elasticsearch6.x索引api
4、基本数据类型 int操作 bool布尔操作 str字符串操作 "for in 循环"
5、POJ1159:动态规划


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn