1 Create PROCEDURE [dbo].[up_DataPager] 2 @tblName varchar(255), -- 表名 3 @fldName varchar(255), -- 排序的字段名,一般为唯一标识 4 @strGetFields varchar(1000) = ' * ', -- 需要返回的列 5 @PageSize int = 10, -- 每页有多少条记录 6 @PageIndex int = 1, -- 第几页 7 @Count int output, -- 返回记录总数 8 @OrderType bit = 0, -- 设置排序类型, 非 0 值则降序 9 @strWhere varchar(1500) = ' 1=1 ' -- 查询条件 (注意: 不要加 where,初始化为1=1使得查询条件永远不为空) 10 AS 11 declare @strSQL varchar(5000) -- 主语句 12 declare @strTmp varchar(110) -- 临时变量 13 declare @strOrder varchar(400) -- 排序类型 14 declare @sumsql nvarchar(3000) -- 记录总数 15 --执行总数统计。 16 set @sumsql = 'select @Count = count(*) from '+@tblname +' where '+@strwhere 17 exec sp_executesql @sumsql,N'@Count int output',@Count output-- 纪录总数 18 --如果@OrderType不是0,就执行降序 19 if @OrderType != 0 20 begin 21 set @strTmp = '<(select min' 22 set @strOrder = ' order by [' + @fldName +'] desc' 23 end 24 else 25 begin 26 set @strTmp = '>(select max' 27 set @strOrder = ' order by [' + @fldName +'] asc' 28 end 29 --如果是第一页就执行以下代码,加快执行速度 30 if @PageIndex = 1 31 set @strSQL ='select top ' + str(@PageSize) +' '+@strGetFields+ ' 32 from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder 33 else 34 --以下代码赋予了@strSQL以真正执行的SQL代码 35 set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from [' 36 + @tblName + '] where [' + @fldName + ']' + @strTmp + '([' 37 + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 38 + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' ' 39 + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder 40 exec (@strSQL) 41 GO 42 43 -- ============================================= 44 -- 使用RowNumber分页 45 -- 参数 46 -- { 47 -- @SQL : 查询语句 48 -- @Order : 排序字段 49 -- @CurPage : 当前页 50 -- @PageRows : 每页大小 51 -- @TotalRecorder : 记录总数 52 -- } 53 -- ============================================= 54 CREATE PROCEDURE [dbo].[up_DataPageRowNumber] 55 -- Add the parameters for the stored procedure here 56 @SQL Nvarchar(2000), 57 @Order Nvarchar(20), 58 @PageIndex int, 59 @PageSize int, 60 @TotalRecorder int output 61 AS 62 BEGIN 63 -- SET NOCOUNT ON added to prevent extra result sets from 64 SET NOCOUNT ON; 65 declare @ExceSQL nvarchar(4000) 66 67 68 --设置开始行号 69 declare @start_row_num AS int 70 SET @start_row_num = (@PageIndex - 1) * @PageSize + 1 71 --设置结束行号 72 declare @end_row_num int 73 set @end_row_num = @PageIndex * @PageSize 74 75 --设置标识语句 76 declare @RowNumber nvarchar(100) 77 set @RowNumber = ', ROW_NUMBER() OVER(ORDER BY ' + @Order + ') as RowNumber from ' 78 79 set @SQL = Replace(@SQL,' from ',@RowNumber) 80 81 --获取记录总数 82 set @ExceSQL = 'select @TotalRecorder=max(RowNumber) from (' + @SQL + ') as tmp’ 83 84 execute sp_executesql @ExceSQL,N'@TotalRecorder int output',@TotalRecorder output 85 86 --设置查询语句 87 set @ExceSQL = 'select * from (' + @SQL + ') as tmp where RowNumber between ' + Convert(nvarchar,@start_row_num) 88 + ' And ' + Convert(nvarchar, @end_row_num) 89 90 execute(@ExceSQL) 91 92 END 93 GO 94 95 96 97 /********************************************************* 98 * 作 用:数据分页(完整SQL分页存储过程(支持多表联接)) 99 * 使用说明: 100 1、单表调用方法:EXEC up_DataPagerCommon @tblName = 'ipa',@fldName = '*',@pageSize =50,@page = 6789,@fldSort = '',@Sort = 1,@strCondition = '',@ID = 'id',@Dist = 0,@pageCount = null,@Counts = NULL 101 2、多表调用方法:EXEC up_DataPagerCommon @tblName = 'Info LEFT JOIN InfoType it ON it.typeid=Info.tid',@fldName = 'info.*,it.tname',@pageSize =50,@page = 1806,@fldSort = '',@Sort = 0,@strCondition = '',@ID = 'id',@Dist = 0, @pageCount = null,@Counts = NULL 102 * 多表联合查询使用需注意:1、多表中的主键字段不能为相同的名称。2、多表中不能允许具有相同名称的字段,如果存在相同名称的字段你可以使用AS重命名 103 *********************************************************/ 104 CREATE PROCEDURE [dbo].[up_DataPagerCommon] 105 ( 106 @tblName nvarchar(200), ----要显示的表或多个表的连接 107 @fldName nvarchar(500) = '*', ----要显示的字段列表 108 @pageSize int = 10, ----每页显示的记录个数 109 @page int = 1, ----要显示那一页的记录 110 @fldSort nvarchar(200) = null, ----排序字段列表或条件 111 @Sort bit = 0, ----排序方法,1为升序,0为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ') 112 @strCondition nvarchar(1000) = null, ----查询条件,不需where 113 @ID nvarchar(150), ----主表的主键 114 @Dist bit = 0, ----是否添加查询字段的 DISTINCT 默认0不添加/1添加 115 @pageCount int = 1 output, ----查询结果分页后的总页数 116 @Counts int = 1 output ----查询到的记录数 117 ) 118 AS 119 SET NOCOUNT ON 120 Declare @sqlTmp nvarchar(1000) ----存放动态生成的SQL语句 121 Declare @strTmp nvarchar(1000) ----存放取得查询结果总数的查询语句 122 Declare @strID nvarchar(1000) ----存放取得查询开头或结尾ID的查询语句 123 124 Declare @strSortType nvarchar(10) ----数据排序规则A 125 Declare @strFSortType nvarchar(10) ----数据排序规则B 126 127 Declare @SqlSelect nvarchar(50) ----对含有DISTINCT的查询进行SQL构造 128 Declare @SqlCounts nvarchar(50) ----对含有DISTINCT的总数查询进行SQL构造 129 130 131 if @Dist = 0 132 begin 133 set @SqlSelect = 'select ' 134 set @SqlCounts = 'Count(0)' 135 end 136 else 137 begin 138 set @SqlSelect = 'select distinct ' 139 set @SqlCounts = 'Count(DISTINCT '+@ID+')' 140 end 141 142 143 if @Sort=0 144 begin 145 set @strFSortType=' DESC ' 146 set @strSortType=' DESC ' 147 end 148 else 149 begin 150 set @strFSortType=' ASC ' 151 set @strSortType=' ASC ' 152 end 153 154 if(@fldSort is not null and @fldSort<>'') 155 begin 156 set @fldSort=','+@fldSort 157 end 158 else 159 begin 160 set @fldSort=' ' 161 end 162 163 --------生成查询语句-------- 164 --此处@strTmp为取得查询结果数量的语句 165 if @strCondition is null or @strCondition='' --没有设置显示条件 166 begin 167 set @sqlTmp = @fldName + ' From ' + @tblName 168 set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName 169 set @strID = ' From ' + @tblName 170 end 171 else 172 begin 173 set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition 174 set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName + ' where (1>0) ' + @strCondition 175 set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition 176 end 177 178 ----取得查询结果总数量----- 179 exec sp_executesql @strTmp,N'@Counts int out ',@Counts out 180 declare @tmpCounts int 181 if @Counts = 0 182 set @tmpCounts = 1 183 else 184 set @tmpCounts = @Counts 185 186 --取得分页总数 187 set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize 188 189 /**//**当前页大于总页数 取最后一页**/ 190 if @page>@pageCount 191 set @page=@pageCount 192 193 --/*-----数据分页2分处理-------*/ 194 declare @pageIndex int --总数/页大小 195 declare @lastcount int --总数%页大小 196 197 set @pageIndex = @tmpCounts/@pageSize 198 set @lastcount = @tmpCounts%@pageSize 199 if @lastcount > 0 200 set @pageIndex = @pageIndex + 1 201 else 202 set @lastcount = @pagesize 203 204 --为配合显示 205 --set nocount off 206 --select @page curpage,@pageSize pagesize,@pageCount countpage,@tmpCounts [Rowcount] 207 --set nocount on 208 209 --//***显示分页 210 if @strCondition is null or @strCondition='' --没有设置显示条件 211 begin 212 if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理 213 begin 214 if @page=1 215 set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName 216 +' order by '+ @ID+' '+ @strFSortType+@fldSort 217 else 218 begin 219 set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName 220 +' where '+@ID 221 if @Sort=0 222 set @strTmp = @strTmp + '>(select max(' 223 else 224 set @strTmp = @strTmp + '<(select min(' 225 set @strTmp = @strTmp + @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName 226 +' order by '+ @ID+' '+ @strFSortType+@fldSort+') AS TBMinID)' 227 +' order by '+ @ID+' '+ @strFSortType+@fldSort 228 end 229 end 230 else 231 232 begin 233 set @page = @pageIndex-@page+1 --后半部分数据处理 234 if @page <= 1 --最后一页数据显示 235 set @strTmp=@SqlSelect+' * from ('+@SqlSelect+'top '+ CAST(@lastcount as VARCHAR(40))+' '+ @fldName+' from '+@tblName 236 +' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TempTB'+' order by '+ @ID+' '+ @strFSortType+@fldSort 237 else 238 begin 239 set @strTmp=@SqlSelect+' * from ('+@SqlSelect+'top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName 240 +' where '+@ID 241 if @Sort=0 242 set @strTmp=@strTmp+' <(select min(' 243 else 244 set @strTmp=@strTmp+' >(select max(' 245 set @strTmp=@strTmp+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 246 +' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TBMaxID)' 247 +' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TempTB'+' order by '+ @ID+' '+ @strFSortType+@fldSort 248 end 249 end 250 251 end 252 253 else --有查询条件 254 begin 255 if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理 256 begin 257 if @page=1 258 set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName 259 +' where 1=1 ' + @strCondition + ' order by '+ @ID+' '+ @strFSortType+@fldSort 260 else 261 begin 262 set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName 263 +' where '+@ID 264 if @Sort=0 265 set @strTmp = @strTmp + '>(select max(' 266 else 267 set @strTmp = @strTmp + '<(select min(' 268 269 set @strTmp = @strTmp + @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName 270 +' where (1=1) ' + @strCondition +' order by '+ @ID+' '+ @strFSortType+@fldSort+') AS TBMinID)' 271 +' '+ @strCondition +' order by '+ @ID+' '+ @strFSortType+@fldSort 272 end 273 end 274 else 275 begin 276 set @page = @pageIndex-@page+1 --后半部分数据处理 277 if @page <= 1 --最后一页数据显示 278 set @strTmp=@SqlSelect+' * from ('+@SqlSelect+'top '+ CAST(@lastcount as VARCHAR(40))+' '+ @fldName+' from '+@tblName 279 +' where (1=1) '+ @strCondition +' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TempTB'+' order by '+ @ID+' '+ @strFSortType+@fldSort 280 else 281 begin 282 set @strTmp=@SqlSelect+' * from ('+@SqlSelect+'top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName 283 +' where '+@ID 284 if @Sort=0 285 set @strTmp = @strTmp + '<(select min(' 286 else 287 set @strTmp = @strTmp + '>(select max(' 288 set @strTmp = @strTmp + @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 289 +' where (1=1) '+ @strCondition +' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TBMaxID)' 290 +' '+ @strCondition+' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TempTB'+' order by '+ @ID+' '+ @strFSortType+@fldSort 291 end 292 end 293 294 end 295 296 ------返回查询结果----- 297 SET NOCOUNT off 298 exec sp_executesql @strTmp 299 print @strTmp 300 301 GO