作者: LikeCode 出处: CODE STUDIO <script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
目前还有广大的用户在使用 Micrisoft SQL Server 2000, 但这个版的 DB 很致命的一个缺点是查询时不可指定返回行号的数据, 起码没有直接可用的关键字或方法, 幸好人类的智慧是无穷的(^^), 没有直接的方法就用间接的方法.
通用分页查询存储过程不同的版本多如牛毛, 我用过多种, 感觉还是李天王代码自动生成器里的那个好用, 在效率和功能上都做到很好的平衡, 我稍稍修改一下, 加个一个字段选择变量, 这样就可以指定返回的字段.
SQL 脚本如下:
if
exists
(
select
*
from
dbo.sysobjects
where
id
=
object_id
(N
'
[dbo].[GetRecordByPage]
'
)
and
OBJECTPROPERTY
(id, N
'
IsProcedure
'
)
=
1
)
drop procedure [ dbo ] . [ GetRecordByPage ]
GO
CREATE PROCEDURE GetRecordByPage
@tblName varchar ( 255 ), -- 表名
@fldName varchar ( 255 ), -- 主键字段名
@PageSize int = 10 , -- 页尺寸
@PageIndex int = 1 , -- 页码
@OrderType bit = 0 , -- 设置排序类型, 非 0 值则降序
@strWhere varchar ( 1000 ) = '' , -- 查询条件 (注意: 不要加 where)
@IsReCount bit = 0 , -- 返回记录总数, 非 0 值则返回
@FieldList varchar ( 200 ) -- 返回的字段
AS
declare @strSQL varchar ( 6000 ) -- 主语句
declare @strTmp varchar ( 100 ) -- 临时变量
declare @strOrder varchar ( 400 ) -- 排序类型
if @PageIndex = 0
begin
set @PageIndex = 1
end
if @OrderType != 0
begin
set @strTmp = ' <(select min '
set @strOrder = ' order by [ ' + @fldName + ' ] desc '
end
else
begin
set @strTmp = ' >(select max '
set @strOrder = ' order by [ ' + @fldName + ' ] asc '
end
if @strWhere != '' -- -条件不为空
set @strSQL = ' select top ' + str ( @PageSize ) + ' ' + @FieldList + ' from [ '
+ @tblName + ' ] where [ ' + @fldName + ' ] ' + @strTmp + ' ([ '
+ @fldName + ' ]) from (select top ' + str (( @PageIndex - 1 ) * @PageSize ) + ' [ '
+ @fldName + ' ] from [ ' + @tblName + ' ] where ' + @strWhere + ' '
+ @strOrder + ' ) as tblTmp) and ' + @strWhere + ' ' + @strOrder
else -- -条件为空
set @strSQL = ' select top ' + str ( @PageSize ) + ' ' + @FieldList + ' from [ '
+ @tblName + ' ] where [ ' + @fldName + ' ] ' + @strTmp + ' ([ '
+ @fldName + ' ]) from (select top ' + str (( @PageIndex - 1 ) * @PageSize ) + ' [ '
+ @fldName + ' ] from [ ' + @tblName + ' ] ' + @strOrder + ' ) as tblTmp) '
+ @strOrder
set @strTmp = ''
if @strWhere != ''
set @strTmp = ' where ' + @strWhere
if @PageIndex = 1
begin
set @strSQL = ' select top ' + str ( @PageSize ) + ' ' + @FieldList + ' from [ '
+ @tblName + ' ] ' + @strTmp + ' ' + @strOrder
end
if @IsReCount != 0
set @strSQL = ' select count(*) as Total from [ ' + @tblName + ' ] ' + @strTmp
exec ( @strSQL )
drop procedure [ dbo ] . [ GetRecordByPage ]
GO
CREATE PROCEDURE GetRecordByPage
@tblName varchar ( 255 ), -- 表名
@fldName varchar ( 255 ), -- 主键字段名
@PageSize int = 10 , -- 页尺寸
@PageIndex int = 1 , -- 页码
@OrderType bit = 0 , -- 设置排序类型, 非 0 值则降序
@strWhere varchar ( 1000 ) = '' , -- 查询条件 (注意: 不要加 where)
@IsReCount bit = 0 , -- 返回记录总数, 非 0 值则返回
@FieldList varchar ( 200 ) -- 返回的字段
AS
declare @strSQL varchar ( 6000 ) -- 主语句
declare @strTmp varchar ( 100 ) -- 临时变量
declare @strOrder varchar ( 400 ) -- 排序类型
if @PageIndex = 0
begin
set @PageIndex = 1
end
if @OrderType != 0
begin
set @strTmp = ' <(select min '
set @strOrder = ' order by [ ' + @fldName + ' ] desc '
end
else
begin
set @strTmp = ' >(select max '
set @strOrder = ' order by [ ' + @fldName + ' ] asc '
end
if @strWhere != '' -- -条件不为空
set @strSQL = ' select top ' + str ( @PageSize ) + ' ' + @FieldList + ' from [ '
+ @tblName + ' ] where [ ' + @fldName + ' ] ' + @strTmp + ' ([ '
+ @fldName + ' ]) from (select top ' + str (( @PageIndex - 1 ) * @PageSize ) + ' [ '
+ @fldName + ' ] from [ ' + @tblName + ' ] where ' + @strWhere + ' '
+ @strOrder + ' ) as tblTmp) and ' + @strWhere + ' ' + @strOrder
else -- -条件为空
set @strSQL = ' select top ' + str ( @PageSize ) + ' ' + @FieldList + ' from [ '
+ @tblName + ' ] where [ ' + @fldName + ' ] ' + @strTmp + ' ([ '
+ @fldName + ' ]) from (select top ' + str (( @PageIndex - 1 ) * @PageSize ) + ' [ '
+ @fldName + ' ] from [ ' + @tblName + ' ] ' + @strOrder + ' ) as tblTmp) '
+ @strOrder
set @strTmp = ''
if @strWhere != ''
set @strTmp = ' where ' + @strWhere
if @PageIndex = 1
begin
set @strSQL = ' select top ' + str ( @PageSize ) + ' ' + @FieldList + ' from [ '
+ @tblName + ' ] ' + @strTmp + ' ' + @strOrder
end
if @IsReCount != 0
set @strSQL = ' select count(*) as Total from [ ' + @tblName + ' ] ' + @strTmp
exec ( @strSQL )