从网上找了一个分页存储过程,在使用的过程中出现对非主键排序查询时,查不到数据,根据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
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)。