SQLSERVER中 分页

本文介绍了两种在SQLSERVER中实现分页的方法:一是通过存储过程,先获取满足条件的记录集,然后计算总数并进行分页;二是利用TOP和NOT IN简单实现,但不推荐,因为NOT IN可能影响性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     大概思路,假设有一个分页功能,我们的输入:页码索引值  返回:相应页面的信息

输入的页码索引值->有一个总页码数,才能有索引值,页面上还应该有记录的数量,可能还有额外的参数作为筛选条件

相应页面的信息->一个按某个规则的生成记录集取出索引的一部分(小于或等于固定设定的记录数)

参数:iPageIndex,iPageSize,iToTal(这个作为返回值,可以是符合筛选条件的总的记录数或者页数)

一、存储过程实现分页

--分两部分思路,1.获得要求的记录集    2.分页

ALTER PROC [dbo].[LoadPageCoustomerData]
@pageIndex int,
@pageSize int ,
@starTime datetime,
@endTime dateTime,
@totalCount int output
as
--按客户统计,关键字段:客户ID、客户姓名、客户电话、客户车牌号、销售数量、销售金额
select CustomerId,Name,Tel,PlateNumber,TotalCount,TotalMoney into #Temp from(
SELECT Cus.CustomerId,Cus.Name,Cus.Tel,Cus.PlateNumber,SUM(ISNULL(T.CommodityCount,0)) as TotalCount,SUM(ISNULL(T.Money,0)) as TotalMoney FROM Trade AS T
RIGHT JOIN CustomerInfo AS Cus ON Cus.CustomerId = T.CustomerId
LEFT JOIN CommoditiesList AS Comlist ON Comlist.CommodityId= T.CommodityId
where SalesTime > @starTime and SalesTime < @endTime
group by Cus.CustomerId,Cus.Name,Cus.Tel,Cus.PlateNumber
) as d
--select * from #Temp

--获得活动总纪录数
SELECT @totalCount= COUNT(1) FROM #Temp;
--分页
  SELECT CustomerId,Name,Tel,PlateNumber,TotalCount,TotalMoney
   FROM 
   (
       SELECT  fp.*
              ,ROW_NUMBER() OVER (ORDER BY fp.CustomerId asc) AS RowIndex --row_number()over(规则)常用来作为分页索--引
         FROM #Temp AS fp
   ) g
   --INNER JOIN Data.TestInfo AS b WITH (NOLOCK) ON b.ID  = g.ID
   
   WHERE g.RowIndex > ((@PageIndex-1)*@PageSize) AND g.RowIndex <=( @PageIndex*@PageSize);
--先清除,再删除,速度快
truncate table #Temp;
drop table #Temp

二、利用TOP、not in简单的SQL实现

 


不推荐,not in不符合SQL语句的优化规则.

举例:

select TOP 2 CustomerId from CustomerInfo
where CustomerId
not in 
(
    select TOP 5 t.CustomerId  from --customid是top的依据
    (
    select * from
    CustomerInfo where CredentialsType = 1 --筛选条件
    
    ) as t

这样找出的是第6、7的记录。语句:找出表中不在前5的前2条记录。(我的理解)

还有更多的分页方法,不在列举了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值