日期:2014-05-18  浏览次数:20561 次

发布两个大数据集通用分页存储过程
发布两个大数据集通用分页存储过程,欢迎大家和我联系共同探讨改进方法,同时我也会及时将更新内容发布在下面的网址
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   +