作者: LikeCode 出处: CODE STUDIO <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)
本文介绍了一个针对Microsoft SQL Server 2000的通用分页查询存储过程,该过程通过间接方法实现了指定返回行号的数据查询功能。代码允许用户指定表名、主键字段名、页尺寸、页码等参数。
844

被折叠的 条评论
为什么被折叠?



