通用分页存储过程 采用ROW_NUMBER(),支持2005及以后的版本
2012-09-04 12:01
169 查看
--通用分页存储过程 采用ROW_NUMBER(),支持2005及以后的版本
CREATE PROCEDURE PR_PAGE
@TableName varchar(5000), --要进行分页的表,也可以用联接,如dbo.employee或dbo.employee INNER JOIN dbo.jobs ON (dbo.employee.job_id=dbo.jobs.job_id)
@Fields varchar(5000), --表中的字段,可以使用*代替
@OrderField varchar(5000), --要排序的字段
@SqlWhere varchar(5000), --WHERE子句
@PageSize int, --分页的大小
@PageIndex int, --要显示的页的索引
@TotalPage int --页的总数
--@TotalPage int output --页的总数
AS
BEGIN
--BEGIN TRAN
DECLARE @sql NVARCHAR(4000);
DECLARE @totalRecord INT ; --记录总数
IF(@SqlWhere IS NULL or @SqlWhere = '')
SET @SqlWhere=''
ELSE
SET @SqlWhere=' WHERE '+@SqlWhere
--利用WHERE子句进行过滤
SET @sql = 'SELECT @totalRecord = COUNT(1) FROM ' + @TableName + @SqlWhere
--执行sql语句得到记录总数
EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT
SELECT @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)
--根据特定的排序字段为为行分配唯一ROW_NUMBER的顺序
SET @sql = 'SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY ' + @OrderField + ') AS rowId,' + @Fields + ' FROM ' + @TableName + @SqlWhere
--确保当前页的索引在合理的范围之内
IF @PageIndex<=0
Set @PageIndex = 1
IF @PageIndex>@TotalPage
SET @PageIndex = @TotalPage
--得到当前页在整个结果集中准确的ROW_NUMBER值
DECLARE @StartRecord INT
DECLARE @EndRecord INT
SET @StartRecord = (@PageIndex-1)*@PageSize + 1
SET @EndRecord = @StartRecord + @PageSize - 1
--输出当前页中的数据
SET @Sql = @Sql + ') AS t' + ' WHERE rowId BETWEEN ' + Convert(varchar(50),@StartRecord) + ' AND ' + Convert(varchar(50),@EndRecord)
EXEC(@Sql)
SELECT @totalRecord
--IF @@Error <> 0
-- BEGIN
-- ROLLBACK TRAN
-- RETURN -1
-- END
--ELSE
-- BEGIN
-- Commit TRAN
-- RETURN @totalRecord
-- END
END
EXEC PR_PAGE 'Student inner join Sex on Student.sexid=sex.sexid','ID,Code,Name,Age,Birthday','ID desc','STUDENT.SEXID=0',10,10000,0
--DECLARE @TotalPage INT
--EXEC PR_PAGE 'Student inner join Sex on Student.sexid=sex.sexid','ID,Code,Name,Age,Birthday','ID desc','STUDENT.SEXID=0',10,10000,@TotalPage OUTPUT
--SELECT @TotalPage
CREATE PROCEDURE PR_PAGE
@TableName varchar(5000), --要进行分页的表,也可以用联接,如dbo.employee或dbo.employee INNER JOIN dbo.jobs ON (dbo.employee.job_id=dbo.jobs.job_id)
@Fields varchar(5000), --表中的字段,可以使用*代替
@OrderField varchar(5000), --要排序的字段
@SqlWhere varchar(5000), --WHERE子句
@PageSize int, --分页的大小
@PageIndex int, --要显示的页的索引
@TotalPage int --页的总数
--@TotalPage int output --页的总数
AS
BEGIN
--BEGIN TRAN
DECLARE @sql NVARCHAR(4000);
DECLARE @totalRecord INT ; --记录总数
IF(@SqlWhere IS NULL or @SqlWhere = '')
SET @SqlWhere=''
ELSE
SET @SqlWhere=' WHERE '+@SqlWhere
--利用WHERE子句进行过滤
SET @sql = 'SELECT @totalRecord = COUNT(1) FROM ' + @TableName + @SqlWhere
--执行sql语句得到记录总数
EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT
SELECT @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)
--根据特定的排序字段为为行分配唯一ROW_NUMBER的顺序
SET @sql = 'SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY ' + @OrderField + ') AS rowId,' + @Fields + ' FROM ' + @TableName + @SqlWhere
--确保当前页的索引在合理的范围之内
IF @PageIndex<=0
Set @PageIndex = 1
IF @PageIndex>@TotalPage
SET @PageIndex = @TotalPage
--得到当前页在整个结果集中准确的ROW_NUMBER值
DECLARE @StartRecord INT
DECLARE @EndRecord INT
SET @StartRecord = (@PageIndex-1)*@PageSize + 1
SET @EndRecord = @StartRecord + @PageSize - 1
--输出当前页中的数据
SET @Sql = @Sql + ') AS t' + ' WHERE rowId BETWEEN ' + Convert(varchar(50),@StartRecord) + ' AND ' + Convert(varchar(50),@EndRecord)
EXEC(@Sql)
SELECT @totalRecord
--IF @@Error <> 0
-- BEGIN
-- ROLLBACK TRAN
-- RETURN -1
-- END
--ELSE
-- BEGIN
-- Commit TRAN
-- RETURN @totalRecord
-- END
END
EXEC PR_PAGE 'Student inner join Sex on Student.sexid=sex.sexid','ID,Code,Name,Age,Birthday','ID desc','STUDENT.SEXID=0',10,10000,0
--DECLARE @TotalPage INT
--EXEC PR_PAGE 'Student inner join Sex on Student.sexid=sex.sexid','ID,Code,Name,Age,Birthday','ID desc','STUDENT.SEXID=0',10,10000,@TotalPage OUTPUT
--SELECT @TotalPage
相关文章推荐
- MSSQL之2005版本之后的行号分区妙用:row_number() over(PARTITION BY X1,X2.. ORDER BY X1,X2... )
- SqlServer 2005 row_number 通用分页存储过程
- cad.net创建wipeout仅支持2008及以后版本
- SQL Server 2005 的分页查询(ROW_NUMBER() OVER 语句)
- SQL2005 四个排名函数(row_number、rank、dense_rank和ntile)的比较
- SQL Server 2005 中的Row_Number()函数
- SQL Server 2005-2008 ROW_NUMBER() 分页函数效率
- SQL 2005的ROW_NUMBER()实现分页的功能
- Sql Server 2005 row_number()分页性能测试
- SQL 分页支持查询 ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNo_
- SQLServer 2005 实现排序报表的利器 排序函数RANK()、DENSE_RANK()、NTILE()和ROW_NUMBER()
- HttpClient在22以后版本不再被支持
- 不同版本SQL Server 2005对BI的支持
- SQL Server 2005-2008 ROW_NUMBER() 分页函数效率
- SQL2005利用ROW_NUMBER() OVER实现分页功能
- 获取服务器的系统日期,出错时采用客户机系统时间。本函数支持MS SQL Server 版本。
- C#拼接SQL语句,SQL Server 2005+,多行多列大数据量情况下,使用ROW_NUMBER实现的高效分页排序
- SQL Server 2005下的分页SQL ,row_number是个鸡肋
- SQL server 2005新增的几个函数,分别是row_number( )、rank( )、,DENSE_RANK( )、ntile( )
- SQL Server 2005 四个排名函数(row_number、rank、dense_rank和ntile)的比较