时间:2021-05-24
本文实例讲述了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, --总页数 @strSql NVARCHAR(4000), --主查询语句 @strTemp NVARCHAR(2000), --临时变量 @strCount NVARCHAR(1000), --统计语句 @strOrderType NVARCHAR(1000) --排序语句BEGINSET @PageCount = @PageSize * (@CurrentPage -1)SET @strOrderType = ' ORDER BY ' + @OrderColumn + ' 'IF @Condition != ''BEGIN IF @CurrentPage = 1 BEGIN IF @GROUP = 1 BEGIN SET @strCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @Table + ' WHERE ' + @Condition + ' GROUP BY ' + @GroupColumn SET @strCount = @strCount + ' SET @TotalCount=@@ROWCOUNT' SET @strSql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @Column + ' FROM ' + @Table + ' WHERE ' + @Condition + ' GROUP BY ' + @GroupColumn + ' ' + @strOrderType END ELSE BEGIN SET @strCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @Table + ' WHERE ' + @Condition SET @strSql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @Column + ' FROM ' + @Table + ' WHERE ' + @Condition + ' ' + @strOrderType END END ELSE BEGIN IF @GROUP = 1 BEGIN SET @strCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @Table + ' WHERE ' + @Condition + ' GROUP BY ' + @GroupColumn SET @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) END ELSE BEGIN SET @strCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @Table + ' WHERE ' + @Condition SET @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) END ENDENDELSE --没有查询条件BEGIN IF @CurrentPage = 1 BEGIN IF @GROUP = 1 BEGIN SET @strCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @Table + ' GROUP BY ' + @GroupColumn SET @strCount = @strCount + 'SET @TotalCount=@@ROWCOUNT' SET @strSql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @Column + ' FROM ' + @Table + ' GROUP BY ' + @GroupColumn + ' ' + @strOrderType END ELSE BEGIN SET @strCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @Table SET @strSql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @Column + ' FROM ' + @Table + ' ' + @strOrderType END END ELSE BEGIN IF @GROUP = 1 BEGIN SET @strCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @Table + ' GROUP BY ' + @GroupColumn SET @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) END ELSE BEGIN SET @strCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @Table SET @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) END ENDENDEXEC sp_executesql @strCount, N'@TotalCount INT OUTPUT', @TotalCount OUTPUTIF @TotalCount > 2000BEGIN SET @TotalCount = 2000ENDIF @TotalCount%@PageSize = 0BEGIN SET @TotalPage = @TotalCount / @PageSizeENDELSEBEGIN SET @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.* FROM Person p LEFT JOIN TE a ON a.PID = p.IdWHERE a.pid = 2**/希望本文所述对大家SQL Server数据库程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
复制代码代码如下:--分页存储过程示例AlterPROCEDURE[dbo].[JH_PageDemo]@pageSizeint=9000000000,@pag
复制代码代码如下:--*******************************************************--*分页存储过程*--*撒
在google中搜索“分页存储过程”会出来好多结果,是大家常用的分页存储过程,今天我却要说它是有漏洞的,而且漏洞无法通过修改存储过程进行补救,如果你觉得我错了,
邹建的分页存储过程--改了一下因为邹建的分页存储过程不能返回记录总数,所以每次分页还又要统计一次,所以自己在里面加了个返回记录数,这下就好用了。@iPageCo
所以最好在数据访层分页,如果这样就要使用存储过程来分页.以下是以pubs数据库中的employee表为例来进行数据分页的存储过程,你可以参考它根据实际情况来创建