SQL Server 2分法分页存储过程脚本实例
2022-11-12 09:44:48
内容摘要
这篇文章主要为大家详细介绍了SQL Server 2分法分页存储过程脚本实例,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!
需要说明的是:这个存
文章正文
这篇文章主要为大家详细介绍了SQL Server 2分法分页存储过程脚本实例,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!
需要说明的是:这个存储过程参数比较多,我再实际使用中又在外面单独写了一个类,页面调用直接调用封装的类,方法有很多,主要是思路,大家可以参考下。
代码修改集中在类似
代码如下:
1 2 3 4 5 | <code> if @Sort=0 set @strTmp = @strTmp + '<(select min(' else set @strTmp = @strTmp + '>(select max(' </code> |
另外94行主要是配合我自己写的类,显示记录条数分页数等信息,如果不需要就去掉。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | <code> 1ALTER PROCEDURE [dbo].[proc_ListPage] 2( 3 @tblName nvarchar(200), ----要显示的表或多个表的连接 4 @fldName nvarchar(500) = '*' , ----要显示的字段列表 5 @pageSize int = 10, ----每页显示的记录个数 6 @page int = 1, ----要显示那一页的记录 7 @fldSort nvarchar(200) = null, ----排序字段列表或条件 8 @Sort bit = 0, ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如: ' SortA Asc,SortB Desc,SortC ' ) 9 @strCondition nvarchar(1000) = null, ----查询条件,不需where 10 @ID nvarchar(150), ----主表的主键 11 @Dist bit = 0, ----是否添加查询字段的 DISTINCT 默认0不添加/1添加 12 @pageCount int = 1 output, ----查询结果分页后的总页数 13 @Counts int = 1 output ----查询到的记录数 14 ) 15 AS 16 SET NOCOUNT ON 17 Declare @sqlTmp nvarchar(1000) ----存放动态生成的SQL语句 18 Declare @strTmp nvarchar(1000) ----存放取得查询结果总数的查询语句 19 Declare @strID nvarchar(1000) ----存放取得查询开头或结尾ID的查询语句 20 21 Declare @strSortType nvarchar(10) ----数据排序规则A 22 Declare @strFSortType nvarchar(10) ----数据排序规则B 23 24 Declare @SqlSelect nvarchar(50) ----对含有DISTINCT的查询进行SQL构造 25 Declare @SqlCounts nvarchar(50) ----对含有DISTINCT的总数查询进行SQL构造 26 27 28 if @Dist = 0 29 begin 30 set @SqlSelect = 'select ' 31 set @SqlCounts = 'Count(0)' 32 end 33 else 34 begin 35 set @SqlSelect = 'select distinct ' 36 set @SqlCounts = 'Count(DISTINCT ' +@ID+ ')' 37 end 38 39 40 if @Sort=0 41 begin 42 set @strFSortType= ' ASC ' 43 set @strSortType= ' DESC ' 44 end 45 else 46 begin 47 set @strFSortType= ' DESC ' 48 set @strSortType= ' ASC ' 49 end 50 51 52 53 --------生成查询语句-------- 54 --此处@strTmp为取得查询结果数量的语句 55 if @strCondition is null or @strCondition= '' --没有设置显示条件 56 begin 57 set @sqlTmp = @fldName + ' From ' + @tblName 58 set @strTmp = @SqlSelect+ ' @Counts=' +@SqlCounts+ ' FROM ' +@tblName 59 set @strID = ' From ' + @tblName 60 end 61 else 62 begin 63 set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition 64 set @strTmp = @SqlSelect+ ' @Counts=' +@SqlCounts+ ' FROM ' +@tblName + ' where (1>0) ' + @strCondition 65 set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition 66 end 67 68 ----取得查询结果总数量----- 69 exec sp_executesql @strTmp,N '@Counts int out ' ,@Counts out 70 declare @tmpCounts int 71 if @Counts = 0 72 set @tmpCounts = 1 73 else 74 set @tmpCounts = @Counts 75 76 --取得分页总数 77 set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize 78 79 /**/ /**当前页大于总页数 取最后一页**/ 80 if @page>@pageCount 81 set @page=@pageCount 82 83 -- /*-----数据分页2分处理-------*/ 84 declare @pageIndex int --总数/页大小 85 declare @lastcount int --总数%页大小 86 87 set @pageIndex = @tmpCounts/@pageSize 88 set @lastcount = @tmpCounts%@pageSize 89 if @lastcount > 0 90 set @pageIndex = @pageIndex + 1 91 else 92 set @lastcount = @pagesize 93 94 --为配合显示 95 set nocount off 96 select @page curpage,@pageSize pagesize,@pageCount countpage,@tmpCounts [Rowcount] 97 set nocount on 98 99 -- //***显示分页 100 if @strCondition is null or @strCondition= '' --没有设置显示条件 101 begin 102 if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理 103 begin 104 if @page=1 105 set @strTmp=@SqlSelect+ ' top ' + CAST(@pageSize as VARCHAR(40))+ ' ' + @fldName+ ' from ' +@tblName 106 + ' order by ' + @fldSort + ' ' + @strFSortType 107 else 108 begin 109 set @strTmp=@SqlSelect+ ' top ' + CAST(@pageSize as VARCHAR(40))+ ' ' + @fldName+ ' from ' +@tblName 110 + ' where ' +@ID 111 if @Sort=0 112 set @strTmp = @strTmp + '>(select max(' 113 else 114 set @strTmp = @strTmp + '<(select min(' 115 set @strTmp = @strTmp + @ID + ') from (' + @SqlSelect+ ' top ' + CAST(@pageSize*(@page-1) as Varchar(20)) + ' ' + @ID + ' from ' +@tblName 116 + ' order by ' + @fldSort + ' ' + @strFSortType+ ') AS TBMinID)' 117 + ' order by ' + @fldSort + ' ' + @strFSortType 118 end 119 end 120 else 121 122 begin 123 set @page = @pageIndex-@page+1 --后半部分数据处理 124 if @page <= 1 --最后一页数据显示 125 set @strTmp=@SqlSelect+ ' * from (' +@SqlSelect+ ' top ' + CAST(@lastcount as VARCHAR(40))+ ' ' + @fldName+ ' from ' +@tblName 126 + ' order by ' + @fldSort + ' ' + @strSortType+ ') AS TempTB' + ' order by ' + @fldSort + ' ' + @strFSortType 127 else 128 begin 129 set @strTmp=@SqlSelect+ ' * from (' +@SqlSelect+ ' top ' + CAST(@pageSize as VARCHAR(40))+ ' ' + @fldName+ ' from ' +@tblName 130 + ' where ' +@ID 131 if @Sort=0 132 set @strTmp=@strTmp+ ' <(select min(' 133 else 134 set @strTmp=@strTmp+ ' >(select max(' 135 set @strTmp=@strTmp+ @ID + ') from(' + @SqlSelect+ ' top ' + CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) + ' ' + @ID + ' from ' +@tblName 136 + ' order by ' + @fldSort + ' ' + @strSortType+ ') AS TBMaxID)' 137 + ' order by ' + @fldSort + ' ' + @strSortType+ ') AS TempTB' + ' order by ' + @fldSort + ' ' + @strFSortType 138 end 139 end 140 141 end 142 143 else --有查询条件 144 begin 145 if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理 146 begin 147 if @page=1 148 set @strTmp=@SqlSelect+ ' top ' + CAST(@pageSize as VARCHAR(40))+ ' ' + @fldName+ ' from ' +@tblName 149 + ' where 1=1 ' + @strCondition + ' order by ' + @fldSort + ' ' + @strFSortType 150 else 151 begin 152 set @strTmp=@SqlSelect+ ' top ' + CAST(@pageSize as VARCHAR(40))+ ' ' + @fldName+ ' from ' +@tblName 153 + ' where ' +@ID 154 if @Sort=0 155 set @strTmp = @strTmp + '>(select max(' 156 else 157 set @strTmp = @strTmp + '<(select min(' 158 159 set @strTmp = @strTmp + @ID + ') from (' + @SqlSelect+ ' top ' + CAST(@pageSize*(@page-1) as Varchar(20)) + ' ' + @ID + ' from ' +@tblName 160 + ' where (1=1) ' + @strCondition + ' order by ' + @fldSort + ' ' + @strFSortType+ ') AS TBMinID)' 161 + ' ' + @strCondition + ' order by ' + @fldSort + ' ' + @strFSortType 162 end 163 end 164 else 165 begin 166 set @page = @pageIndex-@page+1 --后半部分数据处理 167 if @page <= 1 --最后一页数据显示 168 set @strTmp=@SqlSelect+ ' * from (' +@SqlSelect+ ' top ' + CAST(@lastcount as VARCHAR(40))+ ' ' + @fldName+ ' from ' +@tblName 169 + ' where (1=1) ' + @strCondition + ' order by ' + @fldSort + ' ' + @strSortType+ ') AS TempTB' + ' order by ' + @fldSort + ' ' + @strFSortType 170 else 171 begin 172 set @strTmp=@SqlSelect+ ' * from (' +@SqlSelect+ ' top ' + CAST(@pageSize as VARCHAR(40))+ ' ' + @fldName+ ' from ' +@tblName 173 + ' where ' +@ID 174 if @Sort=0 175 set @strTmp = @strTmp + '<(select min(' 176 else 177 set @strTmp = @strTmp + '>(select max(' 178 set @strTmp = @strTmp + @ID + ') from(' + @SqlSelect+ ' top ' + CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) + ' ' + @ID + ' from ' +@tblName 179 + ' where (1=1) ' + @strCondition + ' order by ' + @fldSort + ' ' + @strSortType+ ') AS TBMaxID)' 180 + ' ' + @strCondition+ ' order by ' + @fldSort + ' ' + @strSortType+ ') AS TempTB' + ' order by ' + @fldSort + ' ' + @strFSortType 181 end 182 end 183 184 end 185 186 ------返回查询结果----- 187 SET NOCOUNT off 188 exec sp_executesql @strTmp 189 print @strTmp </code> |
注:关于SQL Server 2分法分页存储过程脚本实例的内容就先介绍到这里,更多相关文章的可以留意
代码注释