[MSSQL]2分处理数据分页存储过程
2010-09-07 13:37
260 查看
----2分处理数据分页存储过程
Create PROCEDURE ZBPagination
@TblName nvarchar(1000), ----要显示的表或多个表的连接
@FldName nvarchar(1000) = '*', ----要显示的字段列表
@PageSize int = 10, ----每页显示的记录个数
@Page int = 1, ----要显示那一页的记录
@PageCount int = 1 output, ----查询结果分页后的总页数
@Counts int = 1 output, ----查询到的记录数
@FldSort nvarchar(200) = 'ID', ----排序字段(列要主键或唯一值)
@Sort bit = 0, ----排序方法,0为升序,1为降序
@StrCondition nvarchar(1000) = null, ----查询条件,不需where
@ID nvarchar(150) = 'ID', ----主表的主键(要跟排序列的第一列一样)
@Dist bit = 0 ----是否添加查询字段的 DISTINCT 默认0不添加/1添加
AS
SET NOCOUNT ON
Declare @StrTmp nvarchar(3000) ----存放取得查询结果总数的查询语句和动态生成的SQL语句
Declare @StrSortType nvarchar(10) ----数据排序规则A
Declare @StrFSortType nvarchar(10) ----数据排序规则B
Declare @SQLSelect nvarchar(50) ----对含有DISTINCT的查询进行SQL构造
Declare @SQLCounts nvarchar(50) ----对含有DISTINCT的总数查询进行SQL构造
IF @Dist = 0
Begin
Set @SQLSelect = 'Select '
Set @SQLCounts = 'Count(1)'
End
Else
Begin
Set @SQLSelect = 'Select Distinct '
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为取得查询结果数量的语句
Set @StrTmp = @SQLSelect+' @Counts='+@SQLCounts+' FROM ' + @TblName + ' Where (1=1) ' + Isnull(@StrCondition,'')
----取得查询结果总数量-----
Exec Sp_executesql @StrTmp,N'@Counts int OutPut',@Counts OutPut
Declare @TmpCounts Int
If @Counts = 0
Set @TmpCounts = 1
Else
Set @TmpCounts = @Counts
--/*-----数据分页2分处理-------*/
Declare @Lastcount Int --看最后一页还有多少条记录
Set @PageCount = @TmpCounts/@PageSize --总数/页大小 总页数 如 109 / 10 = 10
set @Lastcount = @TmpCounts%@PageSize --总数%页大小 求模(余数) 109 % 10 = 9
If @Lastcount > 0
Set @PageCount = @PageCount + 1
Else
Set @Lastcount = @Pagesize
/*当前页小于1 取第一页 */
If @Page < 1
Set @Page = 1
/*当前页大于总页数 取最后一页*/
If @Page > @PageCount
Set @Page = @PageCount
--//***显示分页
If @PageCount<2 or @Page<=@PageCount / 2 + @PageCount % 2 --前半部分数据处理
Begin
IF @Page=1
Set @StrTmp=@SQLSelect+' Top '+ Cast(@PageSize as Varchar(10))+' '+ @FldName+' From '+ @TblName + ' Where (1=1) ' + Isnull(@StrCondition,'') + ' Order By '+ @FldSort +' '+ @StrFSortType
Else
Begin
IF @Sort = 0 --升序
Begin
Set @StrTmp=@SQLSelect+' Top '+ Cast(@PageSize as Varchar(10))+' '+ @FldName+' From '+ @TblName
+ ' Where ' + @ID + ' > (Select Max('+ @ID +') From ('+ @SQLSelect+' top '+ Cast(@PageSize*(@Page-1) as Varchar(10)) +' '+ @ID +' From '+ @TblName
+ ' Where (1=1) ' + Isnull(@StrCondition,'') +' Order By '+ @FldSort +' '+ @StrFSortType+') AS TBMinID)'
+ ' '+ Isnull(@StrCondition,'') +' Order By '+ @FldSort +' '+ @StrFSortType
End
Else --降序
Begin
Set @StrTmp=@SQLSelect+' Top '+ Cast(@PageSize as Varchar(10))+' '+ @FldName+' From ' + @TblName
+ ' Where ' + @ID + ' <(Select Min('+ @ID +') From ('+ @SQLSelect+' Top '+ Cast(@PageSize*(@Page-1) as Varchar(10)) +' '+ @ID +' From '+ @TblName
+ ' Where (1=1) ' + Isnull(@strCondition,'') +' Order By '+ @FldSort +' '+ @StrFSortType+') AS TBMinID)'
+ ' '+ Isnull(@strCondition,'') +' Order By '+ @FldSort +' '+ @StrFSortType
End
End
End
Else
Begin
Set @Page = @PageCount-@Page+1 --后半部分数据处理
If @Page <= 1 --最后一页数据显示
Set @StrTmp=@SQLSelect + ' * From (' + @SQLSelect + ' Top '+ Cast(@LastCount as Varchar(10))+' '+ @FldName+' From ' + @TblName
+' Where (1=1) '+ Isnull(@StrCondition,'') +' Order By '+ @FldSort + ' ' + @StrSortType+') As TempTB'+' Order by '+ @FldSort +' '+ @StrFSortType
Else
Begin
IF @Sort = 0 --升序
Begin
Set @StrTmp=@SQLSelect+' * From (' + @SQLSelect + ' Top '+ Cast(@PageSize as Varchar(10))+' '+ @FldName+' From ' + @TblName
+' Where ' + @ID + ' <(Select Min('+ @ID +') From('+ @SQLSelect+' Top '+ Cast(@PageSize*(@Page-2)+@Lastcount as Varchar(10)) +' '+ @ID +' From ' + @TblName
+' Where (1=1) '+ Isnull(@strCondition,'') +' Order By ' + @FldSort + ' ' + @StrSortType+') AS TBMaxID)'
+' '+ Isnull(@StrCondition,'') + ' Order By '+ @FldSort + ' ' + @StrSortType+') AS TempTB'+' Order By '+ @FldSort +' '+ @StrFSortType
End
Else --降序
Begin
Set @StrTmp=@SQLSelect+' * From (' + @SQLSelect + ' Top '+ Cast(@PageSize as Varchar(10))+' '+ @FldName+' From ' + @TblName
+ ' Where ' + @ID + ' >(Select Max('+ @ID +') From('+ @SQLSelect+' Top '+ Cast(@PageSize*(@Page-2)+@Lastcount as Varchar(20)) +' '+ @ID +' From ' + @TblName
+ ' Where (1=1) '+ Isnull(@StrCondition,'') +' Order By '+ @FldSort +' '+ @StrSortType+') AS TBMaxID)'
+ ' ' + Isnull(@StrCondition,'') + ' Order By '+ @FldSort +' '+ @StrSortType+') AS TempTB'+' Order By '+ @FldSort +' '+ @StrFSortType
End
End
End
------返回查询结果-----
Exec Sp_executesql @strTmp
SET NOCOUNT OFF
GO
/*
--调用方法
--没有进行模糊查找
Declare @Count Int
Declare @PageCount Int
Declare @ColStr Varchar(500)
Set @ColStr = 'ID,InputDate,SupplierName,SupplierNameChs'
Exec ZBPagination @tblName = 'Supplier',@fldName = @ColStr,
@PageSize = 5,@Page = 80,@pageCount = @PageCount OutPut,
@Counts = @Count OutPut,@fldSort = 'ID DESC,SupplierName',
@Sort = 0,@ID = 'ID'
Select @PageCount,@Count
--模糊查找
Declare @Count Int
Declare @PageCount Int
Declare @ColStr Varchar(500)
Set @ColStr = 'ID,InputDate,SupplierName,SupplierNameChs'
Exec ZBPagination @tblName = 'Supplier',@fldName = @ColStr,@PageSize = 5,
@Page = 40,@pageCount = @PageCount OutPut,
@Counts = @Count OutPut,@fldSort = 'ID DESC,SupplierName',
@strCondition = ' And SupplierNameChs Like ''%有限公司%''',
@Sort = 0,@ID = 'ID'
Select @PageCount,@Count
*/
Create PROCEDURE ZBPagination
@TblName nvarchar(1000), ----要显示的表或多个表的连接
@FldName nvarchar(1000) = '*', ----要显示的字段列表
@PageSize int = 10, ----每页显示的记录个数
@Page int = 1, ----要显示那一页的记录
@PageCount int = 1 output, ----查询结果分页后的总页数
@Counts int = 1 output, ----查询到的记录数
@FldSort nvarchar(200) = 'ID', ----排序字段(列要主键或唯一值)
@Sort bit = 0, ----排序方法,0为升序,1为降序
@StrCondition nvarchar(1000) = null, ----查询条件,不需where
@ID nvarchar(150) = 'ID', ----主表的主键(要跟排序列的第一列一样)
@Dist bit = 0 ----是否添加查询字段的 DISTINCT 默认0不添加/1添加
AS
SET NOCOUNT ON
Declare @StrTmp nvarchar(3000) ----存放取得查询结果总数的查询语句和动态生成的SQL语句
Declare @StrSortType nvarchar(10) ----数据排序规则A
Declare @StrFSortType nvarchar(10) ----数据排序规则B
Declare @SQLSelect nvarchar(50) ----对含有DISTINCT的查询进行SQL构造
Declare @SQLCounts nvarchar(50) ----对含有DISTINCT的总数查询进行SQL构造
IF @Dist = 0
Begin
Set @SQLSelect = 'Select '
Set @SQLCounts = 'Count(1)'
End
Else
Begin
Set @SQLSelect = 'Select Distinct '
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为取得查询结果数量的语句
Set @StrTmp = @SQLSelect+' @Counts='+@SQLCounts+' FROM ' + @TblName + ' Where (1=1) ' + Isnull(@StrCondition,'')
----取得查询结果总数量-----
Exec Sp_executesql @StrTmp,N'@Counts int OutPut',@Counts OutPut
Declare @TmpCounts Int
If @Counts = 0
Set @TmpCounts = 1
Else
Set @TmpCounts = @Counts
--/*-----数据分页2分处理-------*/
Declare @Lastcount Int --看最后一页还有多少条记录
Set @PageCount = @TmpCounts/@PageSize --总数/页大小 总页数 如 109 / 10 = 10
set @Lastcount = @TmpCounts%@PageSize --总数%页大小 求模(余数) 109 % 10 = 9
If @Lastcount > 0
Set @PageCount = @PageCount + 1
Else
Set @Lastcount = @Pagesize
/*当前页小于1 取第一页 */
If @Page < 1
Set @Page = 1
/*当前页大于总页数 取最后一页*/
If @Page > @PageCount
Set @Page = @PageCount
--//***显示分页
If @PageCount<2 or @Page<=@PageCount / 2 + @PageCount % 2 --前半部分数据处理
Begin
IF @Page=1
Set @StrTmp=@SQLSelect+' Top '+ Cast(@PageSize as Varchar(10))+' '+ @FldName+' From '+ @TblName + ' Where (1=1) ' + Isnull(@StrCondition,'') + ' Order By '+ @FldSort +' '+ @StrFSortType
Else
Begin
IF @Sort = 0 --升序
Begin
Set @StrTmp=@SQLSelect+' Top '+ Cast(@PageSize as Varchar(10))+' '+ @FldName+' From '+ @TblName
+ ' Where ' + @ID + ' > (Select Max('+ @ID +') From ('+ @SQLSelect+' top '+ Cast(@PageSize*(@Page-1) as Varchar(10)) +' '+ @ID +' From '+ @TblName
+ ' Where (1=1) ' + Isnull(@StrCondition,'') +' Order By '+ @FldSort +' '+ @StrFSortType+') AS TBMinID)'
+ ' '+ Isnull(@StrCondition,'') +' Order By '+ @FldSort +' '+ @StrFSortType
End
Else --降序
Begin
Set @StrTmp=@SQLSelect+' Top '+ Cast(@PageSize as Varchar(10))+' '+ @FldName+' From ' + @TblName
+ ' Where ' + @ID + ' <(Select Min('+ @ID +') From ('+ @SQLSelect+' Top '+ Cast(@PageSize*(@Page-1) as Varchar(10)) +' '+ @ID +' From '+ @TblName
+ ' Where (1=1) ' + Isnull(@strCondition,'') +' Order By '+ @FldSort +' '+ @StrFSortType+') AS TBMinID)'
+ ' '+ Isnull(@strCondition,'') +' Order By '+ @FldSort +' '+ @StrFSortType
End
End
End
Else
Begin
Set @Page = @PageCount-@Page+1 --后半部分数据处理
If @Page <= 1 --最后一页数据显示
Set @StrTmp=@SQLSelect + ' * From (' + @SQLSelect + ' Top '+ Cast(@LastCount as Varchar(10))+' '+ @FldName+' From ' + @TblName
+' Where (1=1) '+ Isnull(@StrCondition,'') +' Order By '+ @FldSort + ' ' + @StrSortType+') As TempTB'+' Order by '+ @FldSort +' '+ @StrFSortType
Else
Begin
IF @Sort = 0 --升序
Begin
Set @StrTmp=@SQLSelect+' * From (' + @SQLSelect + ' Top '+ Cast(@PageSize as Varchar(10))+' '+ @FldName+' From ' + @TblName
+' Where ' + @ID + ' <(Select Min('+ @ID +') From('+ @SQLSelect+' Top '+ Cast(@PageSize*(@Page-2)+@Lastcount as Varchar(10)) +' '+ @ID +' From ' + @TblName
+' Where (1=1) '+ Isnull(@strCondition,'') +' Order By ' + @FldSort + ' ' + @StrSortType+') AS TBMaxID)'
+' '+ Isnull(@StrCondition,'') + ' Order By '+ @FldSort + ' ' + @StrSortType+') AS TempTB'+' Order By '+ @FldSort +' '+ @StrFSortType
End
Else --降序
Begin
Set @StrTmp=@SQLSelect+' * From (' + @SQLSelect + ' Top '+ Cast(@PageSize as Varchar(10))+' '+ @FldName+' From ' + @TblName
+ ' Where ' + @ID + ' >(Select Max('+ @ID +') From('+ @SQLSelect+' Top '+ Cast(@PageSize*(@Page-2)+@Lastcount as Varchar(20)) +' '+ @ID +' From ' + @TblName
+ ' Where (1=1) '+ Isnull(@StrCondition,'') +' Order By '+ @FldSort +' '+ @StrSortType+') AS TBMaxID)'
+ ' ' + Isnull(@StrCondition,'') + ' Order By '+ @FldSort +' '+ @StrSortType+') AS TempTB'+' Order By '+ @FldSort +' '+ @StrFSortType
End
End
End
------返回查询结果-----
Exec Sp_executesql @strTmp
SET NOCOUNT OFF
GO
/*
--调用方法
--没有进行模糊查找
Declare @Count Int
Declare @PageCount Int
Declare @ColStr Varchar(500)
Set @ColStr = 'ID,InputDate,SupplierName,SupplierNameChs'
Exec ZBPagination @tblName = 'Supplier',@fldName = @ColStr,
@PageSize = 5,@Page = 80,@pageCount = @PageCount OutPut,
@Counts = @Count OutPut,@fldSort = 'ID DESC,SupplierName',
@Sort = 0,@ID = 'ID'
Select @PageCount,@Count
--模糊查找
Declare @Count Int
Declare @PageCount Int
Declare @ColStr Varchar(500)
Set @ColStr = 'ID,InputDate,SupplierName,SupplierNameChs'
Exec ZBPagination @tblName = 'Supplier',@fldName = @ColStr,@PageSize = 5,
@Page = 40,@pageCount = @PageCount OutPut,
@Counts = @Count OutPut,@fldSort = 'ID DESC,SupplierName',
@strCondition = ' And SupplierNameChs Like ''%有限公司%''',
@Sort = 0,@ID = 'ID'
Select @PageCount,@Count
*/
相关文章推荐
- 使用数据2分处理的通用分页存储过程 前半部分与后半部分数据访问时间相同,同等访问速度提高一倍
- 使用数据2分处理的通用分页存储过程 前半部分与后半部分数据访问时间相同
- 毫秒级百万数据分页存储过程(mssql)
- Jquery Easyui插件Datagrid获取后台mssql数据通过存储过程高效分页来获取
- 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案!
- sql 优化之:实现小数据量和海量数据的通用分页显示存储过程(系列四)
- 对于分页时,若数据库的数据不断更新,不让前台显示脏数据(同一条数据重复显示)的处理方式
- 数据库端的分页处理
- 实现小数据量和海量数据的通用分页显示存储过程
- 实现小数据量和海量数据的通用分页显示存储过程
- 数据库中的事务、视图、序列 、同义词、索引、数据字典、PL/SQL块 、异常处理、存储过程
- 小量数据和海量数据分页显示存储过程 (1)
- ASP + mssql 与 查询分析器 之 使用存储过程 建,添,更,选,删 基本数据操作
- TP5-处理分页中的数据
- (转)2分法分页存储过程修正版
- MSSQL MySQL 数据库分页(存储过程)
- mysql 分组、最新数据优先于group,分页同时处理
- 一个将数据分页的存储过程
- 实现小数据量和海量数据的通用分页显示存储过程
- 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案!