挽弓如月

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

*使用not in进行分页

    View Code
    select top  记录条数size  * from Book where id not in ( select top (   页数pageIndex -1 )  记录条数size  id from Book order by id asc ) order by id asc
    那么需要显示所有记录的页数page为:page=(m%n)==0?(m/n):(m/n+1);
 
*使用ROW_NUMBER()进行分页
    View Code 
     select * from (  select ROW_NUMBER() over (order by id asc ) as r1,* from PubBook ) as a where a.r1> (pageIndex -1) size   and a.r1<=pageIndex*size
 
*比较好的存储过程
    View Code
    create PROCEDURE GetPageData
 (
 @TableName varchar(30),--表名称
 @IDName varchar(20),--表主键名称
 @PageIndex int,--当前页数 
 @PageSize int--每页大小 
 )
 AS
 IF @PageIndex > 0
 BEGIN
 set nocount on
    DECLARE @PageLowerBound int,@StartID int,@sql nvarchar(225)
    SET @PageLowerBound = @PageSize * (@PageIndex-1)
    IF @PageLowerBound<1
     SET @PageLowerBound=1
    SET ROWCOUNT @PageLowerBound
    SET @sql=N'SELECT @StartID = ['+@IDName+'] FROM '+@TableName+' ORDER BY '+@IDName
      exec sp_executesql @sql,N'@StartID int output',@StartID output
    SET ROWCOUNT 0
    SET @sql='select top '+str(@PageSize) +' * from '+@TableName+' where ['+@IDName+']>='+ str(@StartID) +' ORDER BY ['+@IDName+'] '
    EXEC(@sql)
 set nocount off
 END
 
*在没有ROW_NUMBER()的SQL2000中的分页
CREATE procedure   [dbo].[AspNetPage]
    @tblName         varchar(1000),         -- 表名
    @SelectFieldName    varchar(4000),     -- 要显示的字段名(不要加select)
    @strWhere        varchar(4000),        -- 查询条件(注意: 不要加 where)
    @OrderFieldName     varchar(255),     -- 排序索引字段名
    @PageSize       int ,                  -- 页大小
    @PageIndex      int = 1,               -- 页码
    @iRowCount      int output,            -- 返回记录总数
    @OrderType      bit = 0                -- 设置排序类型, 0 值则升序,1为降序 
           
AS
 declare @strSQL     varchar(4000)        -- 主语句
 declare @strTmp     varchar(4000)         -- 临时变量
 declare @strOrder  varchar(400)         -- 排序类型
 declare @strRowCount    nvarchar(4000)      -- 用于查询记录总数的语句
 --去掉排序字段的空格
 set @OrderFieldName=ltrim(rtrim(@OrderFieldName))
 --如果降序
 if @OrderType != 0
 begin
  set @strTmp = '<(select min'
  set @strOrder = ' order by ' + @OrderFieldName +' desc'
 end
 --如果升序
 else
 begin
  set @strTmp = '>(select max'
  set @strOrder = ' order by ' + @OrderFieldName +' asc'
 end
 --查询主语句
 set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from ' + @tblName + ' where ' + @OrderFieldName + @strTmp + '('
  + right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + str((@PageIndex-1)*@PageSize)
  + @OrderFieldName + ' from ' + @tblName + @strOrder + ') as tblTmp)' + @strOrder
 --如果条件不为空 
 if @strWhere != ''
    set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '  + @tblName + ' where ' + @OrderFieldName + @strTmp + '('
        + right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + str((@PageIndex-1)*@PageSize)
        + @OrderFieldName + ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
 --如果页面为1
 if @PageIndex = 1
 begin
  set @strTmp = ''
  if @strWhere != ''
   set @strTmp = ' where ' + @strWhere
   set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '  + @tblName + @strTmp + ' ' + @strOrder
 end
 --执行语句
 exec(@strSQL)
 --如果条件不为空
 if @strWhere!=''
 begin
  set @strRowCount = 'select @iRowCount=count(*) from ' + @tblName+' where '+@strWhere
 end
 else
 begin
  set @strRowCount = 'select @iRowCount=count(*) from ' + @tblName
 end
 --执行语句
 exec sp_executesql @strRowCount,N'@iRowCount int out',@iRowCount out
GO
-----------------------------------------------------------------------------------------
 
--分页存储过程
Create PROCEDURE [dbo].[UP_CommonPager]
@Sql nvarchar(4000),           -- 要执行的SQL语句
@CurrentPageIndex int = 1,     -- 当前页索引,从1开始编号
@PageSize int = 10,            -- 每页纪录数
@OrderCondition nvarchar(100),       -- 排序规则,如 id,name desc
@RecordCount int output              -- 纪录总数
As
declare @ExecSQL nvarchar(4000),@StartIndex int,@EndIndex int
set @StartIndex = (@CurrentPageIndex-1)*@PageSize+1
set @EndIndex = @StartIndex+@PageSize-1
set @ExecSQL = replace('select @RecordCount=count(*) from (@Sql) UP_CommonPager_Count','@Sql',@Sql)
exec sp_executesql @ExecSQL,N'@RecordCount int output',@RecordCount output
if @RecordCount<=@PageSize
begin
set @ExecSQL = @Sql + ' order by ' + @OrderCondition
exec(@ExecSQL)
end
else
begin
set @ExecSQL = 'with temptbl as (
SELECT ROW_NUMBER() OVER (ORDER BY @OrderCondition)AS RowIndex,UP_CommonPager_TempTbl.* 
from (@Sql) UP_CommonPager_TempTbl)
SELECT * FROM temptbl where RowIndex between @StartIndex and @EndIndex'
set @ExecSQL = replace(@ExecSQL,'@StartIndex',Convert(varchar(10),@StartIndex))
set @ExecSQL = replace(@ExecSQL,'@EndIndex',Convert(varchar(10),@EndIndex))
set @ExecSQL = replace(@ExecSQL,'@OrderCondition',@OrderCondition)
set @ExecSQL = replace(@ExecSQL,'@Sql',@Sql)
--print @ExecSQL
exec(@ExecSQL)
end
GO
posted on 2013-03-18 10:04  挽弓如月  阅读(208)  评论(0)    收藏  举报