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