Welcome

首页 / 数据库 / SQLServer / MSSQL分页存储过程完整示例(支持多表分页存储)

本文实例讲述了MSSQL分页存储过程。分享给大家供大家参考,具体如下:
USE [DB_Common]GO/****** 对象: StoredProcedure [dbo].[Com_Pagination]脚本日期: 03/09/2012 23:46:20 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO/************************************************************ * *Sql分页存储过程(支持多表分页存储) * *调用实例: EXEC Com_Pagination 100, --总记录数 0, --总页数-- "Person",--查询的表名 " Person p LEFT JOIN TE a ON a.PID=p.Id ", --查询的表名(这里为多表) "a.*", --查询数据列 "p.ID", --排列字段 "p.ID", --分组字段 2, --每页记录数 1, --当前页数 0, --是否使用分组,否是 " a.pid=2"--查询条件 ************************************************************/CREATE PROCEDURE [dbo].[Com_Pagination]@TotalCount INT OUTPUT, --总记录数@TotalPage INT OUTPUT, --总页数@Table NVARCHAR(1000), --查询的表名(可多表,例如:Person p LEFT JOIN TE a ON a.PID=p.Id )@Column NVARCHAR(1000), --查询的字段,可多列或者为*@OrderColumn NVARCHAR(100), --排序字段@GroupColumn NVARCHAR(150), --分组字段@PageSize INT, --每页记录数@CurrentPage INT, --当前页数@Group TINYINT, --是否使用分组,否是@Condition NVARCHAR(4000) --查询条件(注意:若这时候为多表查询,这里也可以跟条件,例如:a.pid=2)ASDECLARE @PageCount INT, --总页数@strSqlNVARCHAR(4000), --主查询语句@strTempNVARCHAR(2000), --临时变量@strCount NVARCHAR(1000), --统计语句@strOrderType NVARCHAR(1000) --排序语句BEGINSET @PageCount = @PageSize * (@CurrentPage -1)SET @strOrderType = " ORDER BY " + @OrderColumn + " "IF @Condition != ""BEGINIF @CurrentPage = 1BEGINIF @GROUP = 1BEGINSET @strCount = "SELECT @TotalCount=COUNT(*) FROM " + @Table+ " WHERE " + @Condition + " GROUP BY " + @GroupColumnSET @strCount = @strCount + " SET @TotalCount=@@ROWCOUNT"SET @strSql = "SELECT TOP " + STR(@PageSize) + " " + @Column + " FROM " + @Table + " WHERE " + @Condition + " GROUP BY " + @GroupColumn + " " + @strOrderTypeENDELSEBEGINSET @strCount = "SELECT @TotalCount=COUNT(*) FROM " + @Table+ " WHERE " + @ConditionSET @strSql = "SELECT TOP " + STR(@PageSize) + " " + @Column + " FROM " + @Table + " WHERE " + @Condition + " " + @strOrderTypeENDENDELSEBEGINIF @GROUP = 1BEGINSET @strCount = "SELECT @TotalCount=COUNT(*) FROM " + @Table+ " WHERE " + @Condition + " GROUP BY " + @GroupColumnSET @strCount = @strCount + " SET @TotalCount=@@ROWCOUNT"SET @strSql = "SELECT * FROM (SELECT TOP (2000) " + @Column + ",ROW_NUMBER() OVER(" + @strOrderType + ") AS NUM FROM " + @Table + " WHERE " + @Condition + " GROUP BY " + @GroupColumn + ") AS T WHERE NUM BETWEEN " + STR(@PageCount + 1) + " AND " + STR(@PageCount + @PageSize)ENDELSEBEGINSET @strCount = "SELECT @TotalCount=COUNT(*) FROM " + @Table+ " WHERE " + @ConditionSET @strSql = "SELECT * FROM (SELECT TOP (2000) " + @Column + ",ROW_NUMBER() OVER(" + @strOrderType + ") AS NUM FROM " + @Table + " WHERE " + @Condition + ") AS T WHERE NUM BETWEEN " + STR(@PageCount + 1) + " AND " + STR(@PageCount + @PageSize)ENDENDENDELSE--没有查询条件BEGINIF @CurrentPage = 1BEGINIF @GROUP = 1BEGINSET @strCount = "SELECT @TotalCount=COUNT(*) FROM " + @Table+ " GROUP BY " + @GroupColumnSET @strCount = @strCount + "SET @TotalCount=@@ROWCOUNT"SET @strSql = "SELECT TOP " + STR(@PageSize) + " " + @Column + " FROM " + @Table + " GROUP BY " + @GroupColumn + " " + @strOrderTypeENDELSEBEGINSET @strCount = "SELECT @TotalCount=COUNT(*) FROM " + @TableSET @strSql = "SELECT TOP " + STR(@PageSize) + " " + @Column + " FROM " + @Table + " " + @strOrderTypeENDENDELSEBEGINIF @GROUP = 1BEGINSET @strCount = "SELECT @TotalCount=COUNT(*) FROM " + @Table+ " GROUP BY " + @GroupColumnSET @strCount = @strCount + "SET @TotalCount=@@ROWCOUNT"SET @strSql = "SELECT * FROM (SELECT TOP (2000) " + @Column + ",ROW_NUMBER() OVER(" + @strOrderType + ") AS NUM FROM " + @Table + " GROUP BY " + @GroupColumn + ") AS T WHERE NUM BETWEEN " + STR(@PageCount + 1) + " AND " + STR(@PageCount + @PageSize)ENDELSEBEGINSET @strCount = "SELECT @TotalCount=COUNT(*) FROM " + @TableSET @strSql = "SELECT * FROM (SELECT TOP (2000) " + @Column + ",ROW_NUMBER() OVER(" + @strOrderType + ") AS NUM FROM " + @Table + ") AS T WHERE NUM BETWEEN " + STR(@PageCount + 1) + " AND " + STR(@PageCount + @PageSize)ENDENDENDEXEC sp_executesql @strCount, N"@TotalCount INT OUTPUT", @TotalCount OUTPUTIF @TotalCount > 2000BEGINSET @TotalCount = 2000ENDIF @TotalCount%@PageSize = 0BEGINSET @TotalPage = @TotalCount / @PageSizeENDELSEBEGINSET @TotalPage = @TotalCount / @PageSize + 1ENDSET NOCOUNT ONEXEC (@strSql)ENDSET NOCOUNT OFF/**调用实例:EXEC Com_Pagination 100, --总记录数 0, --总页数-- "Person",--查询的表名 " Person p LEFT JOIN TE a ON a.PID=p.Id ", --查询的表名(这里为多表) "a.*", --查询数据列 "p.ID", --排列字段 "p.ID", --分组字段 2, --每页记录数 1, --当前页数 0, --是否使用分组,否是 " a.pid=2"--查询条件SELECT a.* FROMPerson pLEFT JOIN TE aON a.PID = p.IdWHERE a.pid = 2**/
希望本文所述对大家SQL Server数据库程序设计有所帮助。