SQL Server 2000通用分页查询存储过程(可指定返回字段,查询条件)
2007-12-23 15:27
966 查看
作者: LikeCode 出处: CODE STUDIO
目前还有广大的用户在使用 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)
目前还有广大的用户在使用 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)
相关文章推荐
- 【转】两个sql server 2000的通用分页存储过程
- sql server 2000 单主键高效分页存储过程 (支持多字段排序)
- :[百万级]通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录
- 目前来看较完美的通用二分法分页存储过程,not in模式,适用于非数值ID,可多字段排序,可以distinct——SQL Server
- 两个Sql Server 2000的通用分页存储过程
- 两个sql server 2000的通用分页存储过程
- SQL Server 分页查询通用存储过程
- SQL Server 2000 通用单表或视图查询存储过程及C#调用示例
- 通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录
- 通用的可带查询条件的SQL语句的分页存储过程
- 通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录
- 通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录
- 通用的可带查询条件的SQL语句的分页存储过程(2)
- 通用分页显示查询存储过程(SQL Server)
- 通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录
- sql server 2000存储过程的返回值
- 通用存储过程之五: 根据查询条件,获取表记录数的存储过程。
- 折腾Oracle问题小菜记[分页存储过程/查询所有表、视图、存储过程/查询表、视图、存储过程字段结构与参数](三)
- SQL Server存储过程同时返回分页结果集和总数