Sql Server存储过程分页总结

分页方案一:(利用Not In和SELECT TOP分页)
语句形式:
SELECT   TOP   10   *
FROM  TestTable
WHERE  (ID  NOT   IN
           (
SELECT   TOP   20  id
          
FROM  TestTable
          
ORDER   BY  id))
ORDER   BY  ID 

SELECT   TOP  页大小  *
FROM  TestTable
WHERE  (ID  NOT   IN
           (
SELECT   TOP  页大小 * 页数 id
          
FROM  表
          
ORDER   BY  id))
ORDER   BY  ID
分页方案二:
语句形式:
Create     PROCEDURE  ListPage(
@tblName     nvarchar ( 200 ),             -- --要显示的表或多个表的连接
@fldName     nvarchar ( 200 =   ' * ' ,            -- --要显示的字段列表
@pageSize   int   =   10 ,                      -- --每页显示的记录个数
@page     int   =   1 ,             -- --要显示那一页的记录
@pageCount   int   =   1  output,            -- --查询结果分页后的总页数
@Counts   int   =   1  output,             -- --查询到的记录数
@fldSort   nvarchar ( 100 =   null ,            -- --排序字段列表或条件
@Sort     bit   =   0 ,             -- --排序方法,0为升序,1为降序
@strCondition   nvarchar ( 200 =   null -- --查询条件,不需where
@ID     nvarchar ( 50 )    -- --主表的主键
)
AS
SET  NOCOUNT  ON
Declare   @sqlTmp   nvarchar ( 1000 )    -- --存放动态生成的SQL语句
Declare   @strTmp   nvarchar ( 1000 )    -- --存放取得查询结果总数的查询语句
Declare   @strID     nvarchar ( 1000 )    -- --存放取得查询开头或结尾ID的查询语句
Declare   @sqlSort   nvarchar ( 200 )    -- --存放临时生成的排序条件
Declare   @intCounts   int      -- --要移动的记录数
Declare   @BeginID   int      -- --开始的ID
Declare   @EndID      int      -- --结束的ID


-- ------首先生成排序方法---------
if   @Sort = 0     -- 升序
begin
    
if   not ( @fldSort   is   null )
   
set   @sqlSort   =   '  Order by  '   +   @fldSort  
    
else
   
set   @sqlSort   =   '  Order by  '   +   @ID  
end
else      -- 降序
begin
if   not ( @fldSort   is   null )
   
set   @sqlSort   =   '  Order by  '   +   @fldSort   +   '  DESC '   
else
   
set   @sqlSort   =   '  Order by  '   +   @ID   +   '  DESC  '
end


-- ------生成查询语句--------
--
此处@strTmp为取得查询结果数量的语句
if   @strCondition   is   null   -- 没有设置显示条件
begin
set   @sqlTmp   =     @fldName   +   '  From  '   +   @tblName
set   @strTmp   =   ' select @Counts=Count( '   +   @ID   +   ' ) FROM  ' + @tblName
set   @strID   =   '  From  '   +   @tblName
end
else
begin
set   @sqlTmp   =   +   @fldName   +   ' From  '   +   @tblName   +   '  where  '   +   @strCondition
set   @strTmp   =   ' select @Counts=Count( '   +   @ID   +   ' ) FROM  ' + @tblName   +   '  where  '   +   @strCondition
set   @strID   =   '  From  '   +   @tblName   +   '  where  '   +   @strCondition
end


-- --取得查询结果总数量-----
exec  sp_executesql  @strTmp ,N ' @Counts int out  ' , @Counts  out

-- 取得分页总数
if   @Counts   <=   @pageSize
set   @pageCount   =   1
else
set   @pageCount   =  ( @Counts   /   @pageSize +   1


-- 计算要移动的记录数
if   @page   =   1
set   @intCounts   =   @pageSize
else
begin
set   @intCounts   =  ( @page - 1 *   @pageSize   +   1
end

-- ---取得分页后此页的第一条记录的ID
set   @strID   =   ' select @BeginID= '   +   @ID   +   '   '   +   @strID


set   @intCounts   =   @intCounts   -   @pageSize   +   1
set   rowcount     @intCounts
exec  sp_executesql  @strID ,N ' @BeginID int out  ' , @BeginID  out

-- ---取得分页后此页的最后一条记录的ID
set   @intCounts   =   @intCounts   +   @pageSize   -   1
print   @intCounts
set   rowcount     @intCounts
exec  sp_executesql  @strID ,N ' @BeginID int out  ' , @EndID  out


-- ----恢复系统设置-----
set   rowcount     0
SET  NOCOUNT  OFF

-- ----返回查询结果-----
if   @strCondition   is   null
set   @strTmp   =   ' select  '   +   @sqlTmp   +   '  where  '   +   @ID   +   '  between  '   +   str ( @BeginID +   '  and  '   +   str ( @EndID )
else
set   @strTmp   =   ' select  '   +   @sqlTmp   +   '  where  '   +   @ID   + '  (between  '   +   str ( @BeginID +   '  and  '   +   str ( @EndID +   ' )   and  '   +   @strCondition

if   not ( @sqlSort   is   null )
set   @strTmp   =   @strTmp   +   @sqlSort
exec  sp_executesql  @strTmp

GO
分页方案三:
语句形式:
create   PROCEDURE  sy_more_cs
(
@mode   int = 0 ,
@pagesize   int = 10 ,
@pageindex   int = 1
)
AS
SET  NOCOUNT  ON
     
if   @mode = 0
    
begin
      
select   count ( * as  记录数  from  dbo.house_info_cs;
    
end
    
else
    
begin
declare   @indextable   table (id  int   identity ( 1 , 1 ),nid  int )
declare   @PageLowerBound   int
declare   @PageUpperBound   int

set   @PageLowerBound = ( @pageindex - 1 ) * @pagesize
set   @PageUpperBound = @PageLowerBound + @pagesize

insert   into   @indextable (nid)  select   [ id ]   from  dbo.house_info_cs  order   by  dt  desc ;


select  ls. *   from  dbo.house_info_cs ls, @indextable  t  where  ls.id = t.nid
    
and  t.id > @PageLowerBound   and  t.id <= @PageUpperBound   order   by  t.id
   
end
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值