您的位置:首页 > 大数据

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

2009-12-14 18:40 363 查看
发布两个大数据集通用分页存储过程,欢迎大家和我联系共同探讨改进方法,同时我也会及时将更新内容发布在下面的网址 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: