SQL Server 2005分页存储过程
2015-06-02 12:38
447 查看
刚开始学习分页存储过程的时候看到有很多长篇大论的代码,看起来很乱,现在有一个很好的分页存储过程,分享一下:
ALTER PROCEDURE [dbo].[pr_page_helper]
@top INT=NULL, --- 返回前N位记录 -1 :全部
@ascOrDesc bit =NULL, ---1 :DESC 0:ASC
@Column NVARCHAR(2024) = NULL, ---返回的字段
@sqlWhere NVARCHAR(1024) = NULL, ---过滤条件
@orderBy NVARCHAR(1024) = NULL, --排序关键字 --还真不能空
@tableName NVARCHAR(100)=NULL, -- 表名
@currentPage INT = NULL, --页码
@pageSize INT = NULL, --一页的记录条数
@totalCount INT = NULL OUTPUT --记录总数
--@currentPage 和 @pageSize 同时不为空时则分页,其他则是返回前N个记录
AS
BEGIN
DECLARE @sql NVARCHAR(MAX)
DECLARE @tmp_sql NVARCHAR(MAX)
IF ISNULL(@currentpage,0)>0 AND ISNULL(@pagesize,0)>0
BEGIN
DECLARE @N_BEGIN INT
DECLARE @N_END INT
SET @N_BEGIN = @pageSize*(@currentPage-1)+1
SET @N_END = @pageSize*@currentPage
SET @tmp_sql = N'SELECT @pc1 = COUNT(*) '+N' FROM '+@tableName
IF NOT @sqlWhere IS NULL SET @tmp_sql = @tmp_sql + N' WHERE ' + @sqlWhere
EXECUTE sp_executesql @tmp_sql, N'@pc1 INT OUTPUT', @pc1= @totalCount OUTPUT
SET @sql = N' SELECT '+ @Column +N', ROW_NUMBER() OVER(ORDER BY ' + @orderBy
IF ISNULL(@ascOrDesc, 0) > 0
SET @sql = @sql + N' DESC ) AS ROW_NUMBER '
ELSE
SET @sql = @sql + N' ASC ) AS ROW_NUMBER '
SET @sql = @sql + N' FROM '+@tableName
IF NOT @sqlWhere IS NULL SET @sql = @sql + N' WHERE ' + @sqlWhere
SET @sql = N'WITH t AS(' + @sql + N') SELECT * FROM t WHERE t.ROW_NUMBER BETWEEN @between AND @end'
EXECUTE sp_executesql @sql, N'@between INT, @end INT', @between = @N_BEGIN, @end = @N_END
print @sql
print @tmp_sql
select @totalCount
END
ELSE
BEGIN
SET @sql = N'SELECT '
IF ISNULL(@top, 0) > 0 SET @sql = @sql + N' TOP ' + CAST(@top AS NVARCHAR) + N' '
SET @sql = @sql+ @Column + N' FROM '+@tableName
IF NOT @sqlWhere IS NULL SET @sql = @sql + N' WHERE ' + @sqlWhere
IF NOT @orderBy IS NULL
BEGIN
SET @sql = @sql + N' ORDER BY ' + @orderBy
IF ISNULL(@ascOrDesc, 0) > 0
SET @sql = @sql + N' DESC '
ELSE
SET @sql = @sql + N' ASC '
END
print @sql
EXECUTE sp_executesql @sql
END
END
ALTER PROCEDURE [dbo].[pr_page_helper]
@top INT=NULL, --- 返回前N位记录 -1 :全部
@ascOrDesc bit =NULL, ---1 :DESC 0:ASC
@Column NVARCHAR(2024) = NULL, ---返回的字段
@sqlWhere NVARCHAR(1024) = NULL, ---过滤条件
@orderBy NVARCHAR(1024) = NULL, --排序关键字 --还真不能空
@tableName NVARCHAR(100)=NULL, -- 表名
@currentPage INT = NULL, --页码
@pageSize INT = NULL, --一页的记录条数
@totalCount INT = NULL OUTPUT --记录总数
--@currentPage 和 @pageSize 同时不为空时则分页,其他则是返回前N个记录
AS
BEGIN
DECLARE @sql NVARCHAR(MAX)
DECLARE @tmp_sql NVARCHAR(MAX)
IF ISNULL(@currentpage,0)>0 AND ISNULL(@pagesize,0)>0
BEGIN
DECLARE @N_BEGIN INT
DECLARE @N_END INT
SET @N_BEGIN = @pageSize*(@currentPage-1)+1
SET @N_END = @pageSize*@currentPage
SET @tmp_sql = N'SELECT @pc1 = COUNT(*) '+N' FROM '+@tableName
IF NOT @sqlWhere IS NULL SET @tmp_sql = @tmp_sql + N' WHERE ' + @sqlWhere
EXECUTE sp_executesql @tmp_sql, N'@pc1 INT OUTPUT', @pc1= @totalCount OUTPUT
SET @sql = N' SELECT '+ @Column +N', ROW_NUMBER() OVER(ORDER BY ' + @orderBy
IF ISNULL(@ascOrDesc, 0) > 0
SET @sql = @sql + N' DESC ) AS ROW_NUMBER '
ELSE
SET @sql = @sql + N' ASC ) AS ROW_NUMBER '
SET @sql = @sql + N' FROM '+@tableName
IF NOT @sqlWhere IS NULL SET @sql = @sql + N' WHERE ' + @sqlWhere
SET @sql = N'WITH t AS(' + @sql + N') SELECT * FROM t WHERE t.ROW_NUMBER BETWEEN @between AND @end'
EXECUTE sp_executesql @sql, N'@between INT, @end INT', @between = @N_BEGIN, @end = @N_END
print @sql
print @tmp_sql
select @totalCount
END
ELSE
BEGIN
SET @sql = N'SELECT '
IF ISNULL(@top, 0) > 0 SET @sql = @sql + N' TOP ' + CAST(@top AS NVARCHAR) + N' '
SET @sql = @sql+ @Column + N' FROM '+@tableName
IF NOT @sqlWhere IS NULL SET @sql = @sql + N' WHERE ' + @sqlWhere
IF NOT @orderBy IS NULL
BEGIN
SET @sql = @sql + N' ORDER BY ' + @orderBy
IF ISNULL(@ascOrDesc, 0) > 0
SET @sql = @sql + N' DESC '
ELSE
SET @sql = @sql + N' ASC '
END
print @sql
EXECUTE sp_executesql @sql
END
END
相关文章推荐
- MySQL.master and slave 一主多从,切库传输
- 将GitLab的数据库导入阿里云PostgreSQL RDS
- oracle如何查看当前有哪些用户连接到数据库
- 不想在地址栏中曝光你数据库自增ID的方法
- linux下重启oracle数据库
- mysql怎样创建名称有特殊字符的数据库
- [MySQL优化案例]系列 — 分页优化
- SharePoint 2013 迁移内容数据库最简单的配置方法
- mysql中文乱码 + 一种1067错误 + “服务正在启动或者停止中,请稍后片刻再试一次
- mysql常用命令行操作
- mysql如何查询不是身份证号(15位和18位都有)的记录
- 连接oracle数据库出现oracle ORA-12526: TNS: 监听程序: 所有适用例程都处于受限模式
- 关于Oracle和PostgreSQL的schema
- 分布式MySQL数据库TDSQL架构分析
- MySQL 快速入门
- mysql去掉字段字符中间空格
- Mysql 操作
- ORA-01219:数据库未打开:仅允许在固定表/视图中查询
- SQL查询初学者指南读书笔记(五)集合操作与多表查询介绍
- MySql怎样允许主机被远程访问