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