发布两个大数据集通用分页存储过程

32 篇文章 0 订阅
30 篇文章 0 订阅

发布两个大数据集通用分页存储过程,欢迎大家和我联系共同探讨改进方法,同时我也会及时将更新内容发布在下面的网址
http://www.thinksea.com/thinksea/show.aspx?id=92db4c46-2216-4b24-a72b-aa27fcf82e50

/*--用存储过程实现的大数据集分页程序

显示指定表、视图、查询结果的第X页

Copy   Right   2007.09   http://www.thinksea.com   (传播时请保留此信息,谢谢!)
欢迎大家来信批评指正,作者的   Email:thinksea@163.com   QQ:41464129

--调用示例
1、简单调用示例:
exec   SelectPage   "图书表名称 ", "[id] ",5,3, "图书编号,图书名称 ", "图书编号 "
2、因为要顾及通用性,所以对带排序的查询语句有一定要求.如果先排序再出结果时需要使用top   100   percent。示例如下:
exec   SelectPage   "select   top   100   percent   *   from   图书表名称   order   by   图书编号 ", "[id] ",5,3, "图书编号,图书名称 ", "图书编号 "
*/
if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N "[dbo].[SelectPage] ")   and   OBJECTPROPERTY(id,   N "IsProcedure ")   =   1)
drop   procedure   [dbo].[SelectPage]
GO

CREATE   PROCEDURE   [dbo].[SelectPage]
  @QueryString   nvarchar(4000),   --表名、视图名、查询语句
  @KeyFieldName   nvarchar   (250)= " ",   --主键列、标识列或具有唯一值的列名称
  @PageIndex   int=0,   --指定分页索引,从0开始的整数,0表示第一页
  @PageSize   int=10,   --每页的大小(每页显示行数)
  @FieldShow   nvarchar   (4000)= " ",   --要显示的字段列表,*表示全部字段,如果查询结果有标识字段,需要指定此值,且不包含标识字段(因为查询时需要为临时表创建标识字段会产生冲突,采用 uniqueidentifier作为标识字段除外)
  @FieldOrder   nvarchar   (1000)= " "   /*排序字段列表
  注意:因为数据物理存储顺序的不同,如果排序字段存在重复值可能会导致返回的指定分页记录集无效,此时需要附加一唯一值字段排序辅助完成排序功能。
  例如:在一图书表中存在id(图书编号)和name(图书名称)两个字段,其中id字段是唯一值,name字段存在重复值,
  如果从按照name进行排序的记录集中读取数据则应考虑使用“[name]   asc,   [id]   asc”这样的排序字段列表,
  其中“[id]   asc”用来辅助“[name]   asc”完成排序,对于按照name排序的结果中出现name值相同的多条记录按照id进行排序
  */
as
declare   @RecordsCount   int,   --记录总数
  @PagesCount   int   --总页数
IF   isnull(@KeyFieldName, " ")= " "
  BEGIN
  RAISERROR( "必须指定参数   @KeyFieldName ",   16,   1)
  RETURN
  END
set   @KeyFieldName= "   "+@KeyFieldName
select   @FieldShow=case   isnull(@FieldShow, " ")   when   " "   then   "   * "   else   "   "+@FieldShow   end
  ,@FieldOrder=case   isnull(@FieldOrder, " ")   when   " "   then   " "   else   "   order   by   "+@FieldOrder   end
  ,@QueryString=case   when   object_id(@QueryString)   is   not   null   then   "   "+@QueryString   else   "   ( "+@QueryString+ ")   a "   end

declare   @sql   nvarchar(4000)
set   @sql= "select   @RecordsCount=count(*)   from   "+@QueryString
EXEC   sp_executesql   @sql,N "@RecordsCount   int   output ",@RecordsCount   output--计算总页数
set   @PagesCount=ceiling((@RecordsCount+0.0)/@PageSize)

declare   @TempFieldName   nvarchar(50)--临时字段名
set   @TempFieldName= "   [ID_ "+cast(newid()   as   varchar(40))+ "] "

set   @sql=N "SELECT   TOP   "+cast((@PageIndex+1)*@PageSize   as   nvarchar(10))+@TempFieldName   +   N "=identity(int,1,1), "+@KeyFieldName+N "   INTO   #tb1   from "+@QueryString+@FieldOrder+N "
select "+@FieldShow+N "   from "+@QueryString+N "   where "+@KeyFieldName+N "   in(
select   top   "+cast(@PageSize   as   nvarchar(10))+@KeyFieldName+N "   from   #tb1   where "   +   @TempFieldName   +   N " > "+cast(@PageIndex*@PageSize   as   nvarchar(10))
+N ") "+@FieldOrder
EXEC   (   @sql   )
select   @RecordsCount   as   [RecordsCount],   @PagesCount   as   [PagesCount]
GO

 

 

 

/*--用存储过程实现的大数据集分页程序

显示指定表、视图、查询结果的从第X条记录开始的N条记录

Copy   Right   2007.09   http://www.thinksea.com   (传播时请保留此信息,谢谢!)
欢迎大家来信批评指正,作者的   Email:thinksea@163.com   QQ:41464129

--调用示例
1、简单调用示例:
exec   SelectRange   "图书表名称 ", "[id] ",5,3, "图书编号,图书名称 ", "图书编号 "
2、因为要顾及通用性,所以对带排序的查询语句有一定要求.如果先排序再出结果时需要使用top   100   percent。示例如下:
exec   SelectRange   "select   top   100   percent   *   from   图书表名称   order   by   图书编号 ", "[id] ",5,3, "图书编号,图书名称 ", "图书编号 "
*/
if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N "[dbo].[SelectRange] ")   and   OBJECTPROPERTY(id,   N "IsProcedure ")   =   1)
drop   procedure   [dbo].[SelectRange]
GO

CREATE   PROCEDURE   [dbo].[SelectRange]
  @QueryString   nvarchar(4000),   --表名、视图名、查询语句
  @KeyFieldName   nvarchar   (250)= " ",   --主键列、标识列或具有唯一值的列名称
  @BeginIndex   int=0,   --指定起始索引,从0开始的整数,0表示第一条记录
  @Count   int=10,   --最多获取的记录数(行数)(如果取值为   NULL   则忽略此条件,获取从   @BeginIndex   起始的全部记录。)
  @FieldShow   nvarchar   (4000)= " ",   --要显示的字段列表,*表示全部字段,如果查询结果有标识字段,需要指定此值,且不包含标识字段(因为查询时需要为临时表创建标识字段会产生冲突,采用 uniqueidentifier作为标识字段除外)
  @FieldOrder   nvarchar   (1000)= " "   /*排序字段列表
  注意:因为数据物理存储顺序的不同,如果排序字段存在重复值可能会导致返回的指定分页记录集无效,此时需要附加一唯一值字段排序辅助完成排序功能。
  例如:在一图书表中存在id(图书编号)和name(图书名称)两个字段,其中id字段是唯一值,name字段存在重复值,
  如果从按照name进行排序的记录集中读取数据则应考虑使用“[name]   asc,   [id]   asc”这样的排序字段列表,
  其中“[id]   asc”用来辅助“[name]   asc”完成排序,对于按照name排序的结果中出现name值相同的多条记录按照id进行排序
  */
as
IF   isnull(@KeyFieldName, " ")= " "
  BEGIN
  RAISERROR( "必须指定参数   @KeyFieldName ",   16,   1)
  RETURN
  END
set   @KeyFieldName= "   "+@KeyFieldName
select   @FieldShow=case   isnull(@FieldShow, " ")   when   " "   then   "   * "   else   "   "+@FieldShow   end
  ,@FieldOrder=case   isnull(@FieldOrder, " ")   when   " "   then   " "   else   "   order   by   "+@FieldOrder   end
  ,@QueryString=case   when   object_id(@QueryString)   is   not   null   then   "   "+@QueryString   else   "   ( "+@QueryString+ ")   a "   end

declare   @sql   nvarchar(4000)
declare   @TempFieldName   nvarchar(50)--临时字段名
set   @TempFieldName= "   [ID_ "+cast(newid()   as   varchar(40))+ "] "

if   @Count   is   not   null
  set   @sql=N "SELECT   TOP   "+cast(@BeginIndex+@Count   as   nvarchar(10))+@TempFieldName   +   N "=identity(int,1,1), "+@KeyFieldName+N "   INTO   #tb1   from "+@QueryString+@FieldOrder+N "
select "+@FieldShow+N "   from "+@QueryString+N "   where "+@KeyFieldName+N "   in(
select   top   "+cast(@Count   as   nvarchar(10))+@KeyFieldName+N "   from   #tb1   where "   +   @TempFieldName   +   N " > "+cast(@BeginIndex   as   nvarchar(10))
+N ") "+@FieldOrder
else
  set   @sql=N "SELECT   "+@TempFieldName   +   N "=identity(int,1,1), "+@KeyFieldName+N "   INTO   #tb1   from "+@QueryString+@FieldOrder+N "
select "+@FieldShow+N "   from "+@QueryString+N "   where "+@KeyFieldName+N "   in(
select "+@KeyFieldName+N "   from   #tb1   where "   +   @TempFieldName   +   N " > "+cast(@BeginIndex   as   nvarchar(10))
+N ") "+@FieldOrder
EXEC   (   @sql   )
GO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值