SQL存储过程实现分页

第一种:简单的分页实现

DECLARE @pagenum AS INT, @pagesize AS INT
SET @pagenum = 2    --指定显示的页码
SET @pagesize = 3   --每页的条数
SELECT *
FROM (SELECT ROW_NUMBER() OVER(ORDER BY score[字段] DESC, speaker[字段]) AS rownum, *
      FROM SpeakerStats[表名]) AS D
WHERE rownum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesize
第二种:多表联合的分页查询

三张表:Discuss_Table

Talk_Table

User_Table

DECLARE @pagenum AS INT, @pagesize AS INT
SET @pagenum = 2    --指定显示的页码
SET @pagesize = 3   --每页的条数
SELECT * 
FROM(SELECT ROW_NUMBER() over(ORDER BY D_id DESC) AS rownum,a.*,b.*,c.* 
	   FROM(Discuss_Table AS a 
	        INNER JOIN Talk_Table as b 
			ON a.Titleid=b.T_id)
			JOIN User_Table as c 
			ON a.User_id=c.U_id 
			WHERE c.UserName='zhangfugui')as tb
WHERE rownum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesize

第三种:完整的分页查询

CREATE PROCEDURE SP_PAGE 
@TableName varchar(50),          --表名 
@Fields varchar(5000) = '*',     --字段名(全部字段为*) 
@OrderField varchar(5000),       --排序字段(必须支持多字段) 
@sqlWhere varchar(5000) = Null,  --条件语句(不需要附加where) 
@pageSize int,                   --每页多少条记录 
@pageIndex int = 1 ,             --指定当前为第几页 
@TotalPage int output,           --返回条数 
@OrderType bit                   --设置排序类型,1 升序 0 值则降序 
AS 
BEGIN 
declare @strOrder varchar(400)   --排序类型 

BEGIN Tran                       --开始事务 
	--执行SQL语句拼接
	Declare @sqlquery nvarchar(4000); 
	Declare @totalRecord int; 
	--计算总记录数 
	--如果没有条件语句
	IF (@SqlWhere='' or @sqlWhere is NULL) 
	SET @sqlquery = 'select @totalRecord = count(*) from ' + @TableName
	ELSE 
	SET @sqlquery = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere 
	--执行查询数据操作
	EXEC sp_executesql @sqlquery,N'@totalRecord int OUTPUT',@totalRecord OUTPUT   --计算总记录数 

	--计算总页数 
    SET @TotalPage = Ceiling((@totalRecord+0.0)/@pagesize) --计算页总数 

    IF @OrderType = 0   --如果@OrderType是0,就执行降序 
	BEGIN
	SET @strOrder = ' order by [' + @OrderField +'] desc' 
	END
	ELSE                --升序排列
	BEGIN 
	SET @strOrder = ' order by [' + @OrderField +'] asc' 
	END 

	IF (@SqlWhere ='''' or @SqlWhere='' or @sqlWhere is NULL) 
	SET @sqlquery = 'Select * FROM (select ROW_NUMBER() Over( '+@strOrder+' ) as rowId,' + @Fields + ' from ' + @TableName 
	ELSE 
	SET @sqlquery = 'Select * FROM (select ROW_NUMBER() Over( '+@strOrder+' ) as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere 
	
	--处理页数超出范围情况 
	IF @PageIndex<=0 
	SET @pageIndex = 1 
	
	IF @pageIndex>@TotalPage 
	SET @pageIndex = @TotalPage 

	--处理开始点和结束点 
	Declare @StartRecord int 
	Declare @EndRecord int 
	
	--开始节点为1
	SET @StartRecord = (@pageIndex-1)*@PageSize + 1 
	--最后节点为页面节点数
	SET @EndRecord = @StartRecord + @pageSize - 1 

	IF @OrderType = 0 
	BEGIN 
	SET @strOrder = ' order by rowid desc' 
	--如果@OrderType是0,就执行降序,这句很重要!
	END 
	ELSE 
	BEGIN 
	SET @strOrder = ' order by rowid asc' 
	END 
	--继续合成sql语句 
	SET @sqlquery = @sqlquery + ') as ' + @TableName + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' + Convert(varchar(50),@EndRecord) + ' '+@strOrder 
	-- 执行SQL语句 @sqlquery 
	Exec(@sqlquery) 
--------------------------------------------------- 
	IF @@Error <> 0 
	BEGIN
	ROLLBACK Tran 
	RETURN -1 
	END 
	ELSE 
	BEGIN 
	COMMIT Tran 
	RETURN @totalRecord ---返回记录总数 
	End 
END



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值