SQLSERVER一个分页存储过程
2005-10-08 11:47
459 查看
CREATE PROCEDURE PrSqlPager
(
@TableName nvarchar(100), -- 表名
@StrWhere nvarchar(500), -- Where 子句
@IdentityKey nvarchar(100), -- 标识列
@PageNum int, -- 页号
@PageSize int, -- 页大小
@ErrInfo varchar(100) OUTPUT, -- 出错信息
@TotalRecordCount int OUTPUT, -- 总记录数
@PageCount int OUTPUT -- 总页数
)
AS
DECLARE @sql NVARCHAR(1000)
DECLARE @paramDefine NVARCHAR(1000)
/******************** 数据表中总记录数 ***********************/
SET @sql = 'SELECT @TotalRecordCount = COUNT(*) FROM ' + @TableName + ' WHERE 1=1'
IF @StrWhere IS NOT NULL AND @StrWhere <> ''
SET @sql = @sql + ' AND ' + @StrWhere
SET @paramDefine = '@TotalRecordCount INT OUTPUT'
EXEC SP_EXECUTESQL @sql,@paramDefine,@TotalRecordCount OUTPUT
/*************************************************************/
/*********************** 验证页大小 **************************/
IF @PageSize < 0
SET @PageSize = 0
IF @PageSize > @TotalRecordCount
SET @PageNum = @TotalRecordCount
/*************************************************************/
/******************** 根据页大小计算总页数 ***********************/
IF @TotalRecordCount % @PageSize = 0
SET @PageCount = @TotalRecordCount / @PageSize
ELSE
SET @PageCount = @TotalRecordCount / @PageSize + 1
/*************************************************************/
/*********************** 验证页号 ***************************/
IF @PageNum < 1
SET @PageNum = 1
IF @PageNum > @PageCount
SET @PageNum = @PageCount
/*************************************************************/
/******************** 实现分页查询 ***********************/
DECLARE @foreRecordCount INT
SET @foreRecordCount = (@PageNum - 1) * @PageSize + 1
SET @sql = 'SELECT TOP ' + CAST(@PageSize as varchar)
+ ' * FROM ' + @TableName
+ ' WHERE ' + @IdentityKey + ' >= '
+ ' ( SELECT MAX( ' + @IdentityKey + ' ) FROM ( SELECT TOP '
+ CAST(@foreRecordCount as varchar)
+ @IdentityKey + ' FROM ' + @TableName
+ ' ORDER BY ' + @IdentityKey + ' ) AS TempTable ) '
+ ' ORDER BY ' + @IdentityKey
IF @StrWhere IS NOT NULL AND @StrWhere <> ''
SET @sql = @sql + ' AND ' + @StrWhere
SET @paramDefine = N'@PageSize INT,@foreRecordCount INT'
EXEC SP_EXECUTESQL @sql,@paramDefine,@PageSize,@foreRecordCount
/*************************************************************/
GO
(
@TableName nvarchar(100), -- 表名
@StrWhere nvarchar(500), -- Where 子句
@IdentityKey nvarchar(100), -- 标识列
@PageNum int, -- 页号
@PageSize int, -- 页大小
@ErrInfo varchar(100) OUTPUT, -- 出错信息
@TotalRecordCount int OUTPUT, -- 总记录数
@PageCount int OUTPUT -- 总页数
)
AS
DECLARE @sql NVARCHAR(1000)
DECLARE @paramDefine NVARCHAR(1000)
/******************** 数据表中总记录数 ***********************/
SET @sql = 'SELECT @TotalRecordCount = COUNT(*) FROM ' + @TableName + ' WHERE 1=1'
IF @StrWhere IS NOT NULL AND @StrWhere <> ''
SET @sql = @sql + ' AND ' + @StrWhere
SET @paramDefine = '@TotalRecordCount INT OUTPUT'
EXEC SP_EXECUTESQL @sql,@paramDefine,@TotalRecordCount OUTPUT
/*************************************************************/
/*********************** 验证页大小 **************************/
IF @PageSize < 0
SET @PageSize = 0
IF @PageSize > @TotalRecordCount
SET @PageNum = @TotalRecordCount
/*************************************************************/
/******************** 根据页大小计算总页数 ***********************/
IF @TotalRecordCount % @PageSize = 0
SET @PageCount = @TotalRecordCount / @PageSize
ELSE
SET @PageCount = @TotalRecordCount / @PageSize + 1
/*************************************************************/
/*********************** 验证页号 ***************************/
IF @PageNum < 1
SET @PageNum = 1
IF @PageNum > @PageCount
SET @PageNum = @PageCount
/*************************************************************/
/******************** 实现分页查询 ***********************/
DECLARE @foreRecordCount INT
SET @foreRecordCount = (@PageNum - 1) * @PageSize + 1
SET @sql = 'SELECT TOP ' + CAST(@PageSize as varchar)
+ ' * FROM ' + @TableName
+ ' WHERE ' + @IdentityKey + ' >= '
+ ' ( SELECT MAX( ' + @IdentityKey + ' ) FROM ( SELECT TOP '
+ CAST(@foreRecordCount as varchar)
+ @IdentityKey + ' FROM ' + @TableName
+ ' ORDER BY ' + @IdentityKey + ' ) AS TempTable ) '
+ ' ORDER BY ' + @IdentityKey
IF @StrWhere IS NOT NULL AND @StrWhere <> ''
SET @sql = @sql + ' AND ' + @StrWhere
SET @paramDefine = N'@PageSize INT,@foreRecordCount INT'
EXEC SP_EXECUTESQL @sql,@paramDefine,@PageSize,@foreRecordCount
/*************************************************************/
GO
相关文章推荐
- 一个struts+sqlserver的分页存储过程
- SQLSERVER一个比较不错的分页存储过程p_splitpage
- 一个通用的分页存储过程实现-SqlServer(附上sql源码,一键执行即刻搭建运行环境)
- 一个将数据分页的存储过程
- 总结一个分页存储过程[修订版]
- 发布一个高效的数据分页的存储过程 可以轻松应付百万数据
- 一个通用的数据分页的存储过程
- 一个高效的数据分页的存储过程 可以轻松应付百万数据
- 一个项目中正在使用的SQL分页存储过程
- 一个简单的oracle分页存储过程的实现和调用
- [导入]SQLSERVER海量分页存储过程
- SQLServer 实现分页的通用存储过程
- 一个将数据分页的存储过程
- 一个高效的数据分页的存储过程 可以轻松应付百万数据
- SqlServer存储过程分页:大数据量分页存储过程效率测试附代码
- 一个利用Sql Server 20005的 ROW_NUMBER Function 的分页存储过程.
- 一个高效的数据分页的存储过程 可以轻松应付百万数据
- 一个通用的数据分页的存储过程
- 一个分页的类,分页的存储过程,分页的jsp示例