支持任意排序的分页存储过程
2008-10-23 13:07
507 查看
从网上找了一个分页存储过程,在使用的过程中出现对非主键排序查询时,查不到数据,根据sql2005
的特点修改了其bug,已经添加性能测试(2008-10-27)。
存储过程
IF OBJECT_ID(N'[dbo].[pro_GetRecordByPageOrder1]') IS NOT NULL
DROP PROCEDURE [dbo].[pro_GetRecordByPageOrder1]
go
------------------------------------
--用途:支持任意排序的分页存储过程
--说明:
------------------------------------
create PROCEDURE pro_GetRecordByPageOrder1
(
@tblName varchar(255), -- 表名
@fldName varchar(255)='*', -- 显示字段名
@OrderfldName varchar(255), -- 排序字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@IsReCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where)
)
--with encryption
AS
begin
declare @strSQL varchar(6000) -- 主语句
declare @strSQL1 varchar(2000) -- 主语句
declare @strTmp varchar(100) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
set @strTmp = ' where rownum >'+str((@PageIndex-1)*@PageSize)
if @OrderType != 0
begin
set @strOrder = ' order by [' + @OrderfldName +'] desc'
end
else
begin
set @strOrder = ' order by [' + @OrderfldName +'] asc'
end
set @strSQL =' select top ' + str(@PageIndex*@PageSize)
+ ' *, ROW_NUMBER() OVER('+@strOrder+') AS rownum from [' + @tblName + '] ' ;
if @strWhere != ''
set @strSQL = @strSQL+ ' where '+ @strWhere ;
if @PageIndex = 1
begin
set @strSQL =' select top ' + str(@PageSize) + ' ' + @fldName
+ ' from '+@tblName +' '
if @strWhere != ''
set @strSQL = @strSQL + ' where '+@strWhere +' '+@strOrder
else
set @strSQL = @strSQL +' '+@strOrder
end
else
begin
set @strSQL =' select ' + @fldName + ' from ( '+@strSQL+' ) as tmp1 '+@strTmp;
end
if @IsReCount != 0
begin
set @strSQL = @strSQL+' select count(1) as Total from ['+@tblName +'] '
if @strWhere != ''
set @strSQL = @strSQL+' where '+@strWhere
end
print @strsql
exec( @strSQL)
end
go
--endregion
关于存储过程的性能(这个主要看你对查询的索引建立是否合理):
有回复说在字段值完全相同的情况下,要出错的问题,我已经作了测试,是完全能正常执行的(2008-12-09)。
的特点修改了其bug,已经添加性能测试(2008-10-27)。
存储过程
IF OBJECT_ID(N'[dbo].[pro_GetRecordByPageOrder1]') IS NOT NULL
DROP PROCEDURE [dbo].[pro_GetRecordByPageOrder1]
go
------------------------------------
--用途:支持任意排序的分页存储过程
--说明:
------------------------------------
create PROCEDURE pro_GetRecordByPageOrder1
(
@tblName varchar(255), -- 表名
@fldName varchar(255)='*', -- 显示字段名
@OrderfldName varchar(255), -- 排序字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@IsReCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where)
)
--with encryption
AS
begin
declare @strSQL varchar(6000) -- 主语句
declare @strSQL1 varchar(2000) -- 主语句
declare @strTmp varchar(100) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
set @strTmp = ' where rownum >'+str((@PageIndex-1)*@PageSize)
if @OrderType != 0
begin
set @strOrder = ' order by [' + @OrderfldName +'] desc'
end
else
begin
set @strOrder = ' order by [' + @OrderfldName +'] asc'
end
set @strSQL =' select top ' + str(@PageIndex*@PageSize)
+ ' *, ROW_NUMBER() OVER('+@strOrder+') AS rownum from [' + @tblName + '] ' ;
if @strWhere != ''
set @strSQL = @strSQL+ ' where '+ @strWhere ;
if @PageIndex = 1
begin
set @strSQL =' select top ' + str(@PageSize) + ' ' + @fldName
+ ' from '+@tblName +' '
if @strWhere != ''
set @strSQL = @strSQL + ' where '+@strWhere +' '+@strOrder
else
set @strSQL = @strSQL +' '+@strOrder
end
else
begin
set @strSQL =' select ' + @fldName + ' from ( '+@strSQL+' ) as tmp1 '+@strTmp;
end
if @IsReCount != 0
begin
set @strSQL = @strSQL+' select count(1) as Total from ['+@tblName +'] '
if @strWhere != ''
set @strSQL = @strSQL+' where '+@strWhere
end
print @strsql
exec( @strSQL)
end
go
--endregion
关于存储过程的性能(这个主要看你对查询的索引建立是否合理):
有回复说在字段值完全相同的情况下,要出错的问题,我已经作了测试,是完全能正常执行的(2008-12-09)。
相关文章推荐
- 高效多表分页存储过程,可支持多表查询,任意排序
- 专用于SqlServer2005的高效分页存储过程(支持多字段任意排序,不要求排序字段唯一)
- 专用于SqlServer2005的高效分页存储过程(支持多字段任意排序,不要求排序字段唯一)--zt
- 千万数量级分页存储过程(可支持多表查询,任意排序)
- [MSSQL]千万数量级分页存储过程,可支持多表查询,任意排序(来自百度文库)
- 千万数量级分页存储过程2(可支持多表查询,任意排序)
- [MSSQL]千万数量级分页存储过程,可支持多表查询,任意排序(来自百度文库)
- 专用于SqlServer2005的高效分页存储过程(支持多字段任意排序,不要求排序字段唯一)
- 专用于SqlServer2005的高效分页存储过程(支持多字段任意排序,不要求排序字段唯一)
- 千万数量级分页存储过程,可支持多表查询,任意排序
- SqlServer2005的高效分页存储过程(支持多字段任意排序,不要求排序字段唯一)
- 专用于SqlServer2005的高效分页存储过程(支持多字段任意排序,不要求排序字段唯一)
- 支持任意字段排序及多表关联查询的存储过程分页
- 多表查询千万数量级分页存储过程,可支持多表查询,任意排序
- 专用于SqlServer2005的高效分页存储过程(支持多字段任意排序,不要求排序字段唯一)
- 可按任意字段排序的分页存储过程(转)
- 又一个不错的sql分页存储过程,支持排序、搜索
- sql server 2000 单主键高效分页存储过程 (支持多字段排序)
- 实用强大的分页存储过程 支持多字段排序(保证唯一性)
- 【可任意列排序存储过程分页】分享给大家看看。