(分页一) 简单分页
--ROW_NUMBER()实现分页功能

DECLARE @pagenum AS INT, @pagesize AS INT
SET @pagenum = 1
SET @pagesize = 10
SELECT *
FROM (SELECT ROW_NUMBER() OVER(ORDER BY id DESC) AS rownum, id,user_name

FROM SYS_User_Info) AS D
WHERE rownum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesize
ORDER BY id DESC

    EXEC usp_PagingLarge 'bigtable left join bigtable_author on bigtable.d_id=bigtable_author.BigTable_id', 'bigtable.d_id', 'bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author', 20, 0, '', '', 'bigtable.d_time asc,bigtable.d_id desc'

 

与自定义分页结合例子:
/Files/jiny-z/Paging_Custom.rar

存储过程分页(一)alter PROCEDURE SP_Pagination

 

存储过程分页(一)分页查询的方法已经很多很多,在这里我也加入成为其中一员。
存储过程分页(一)      SQL Server中有一个Set Rowcount的的设置,它的意思是使命令的处理在响应指定的行数之后停止处理命令,利用这个特点,我们可以借用它来在一个千万行级数据表中实现高性能分页查询。先来说说实现方式:
存储过程分页(一)      1、我们来假定Table中有一个已经建立了索引的主键字段ID(整数型),我们将按照这个字段来取数据进行分页。
存储过程分页(一)      2、页的大小我们放在@PageSize中
存储过程分页(一)      3、当前页号我们放在@CurrentPage中
存储过程分页(一)      4、如何让记录指针快速滚动到我们要取的数据开头的那一行呢,这是关键所在!有了Set RowCount,我们就很容易实现了。
存储过程分页(一)      5、如果我们成功地滚动记录指针到我们要取的数据的开头的那一行,然后我们把那一行的记录的ID字段的值记录下来,那么,利用Top和条件,我们就很容易的得到指定页的数据了。当然,有了Set RowCount,我们难道还用Top么?
存储过程分页(一)      看看Set Rowcount怎么来帮我们的忙吧:
存储过程分页(一)
存储过程分页(一)Declare @ID int
存储过程分页(一)Declare @MoveRecords int
存储过程分页(一)
存储过程分页(一)--@CurrentPage和@PageSize是传入参数
存储过程分页(一)Set @MoveRecords=@CurrentPage * @PageSize+1
存储过程分页(一)
存储过程分页(一)--下面两行实现快速滚动到我们要取的数据的行,并把ID记录下来
存储过程分页(一)Set Rowcount @MoveRecords
存储过程分页(一)Select @ID=ID from Table1 Order by ID
存储过程分页(一)
存储过程分页(一)Set Rowcount @PageSize
存储过程分页(一)--最恨为了减少麻烦使用*了,但是在这里为了说明方便,暂时用一下
存储过程分页(一)Select * From Table1 Where ID>=@ID Order By ID
存储过程分页(一)Set Rowcount 0
存储过程分页(一)      大家可以试试看,在一个1千W记录的表里面,一下子方翻页到第100页(每页100条),看看有多快!
存储过程分页(一)

 

存储过程分页(一)分享]千万数量级分页存储过程(带效果演示)
存储过程分页(一)效果演示:http://www.cn5135.com/_App/Opportunities/QueryResult.aspx
存储过程分页(一)
存储过程分页(一)CREATE PROCEDURE CN5135_SP_Pagination
GO

 

 

注:
     1)如表名参数为多表连接时,sort列必须指定表名;
     2)只支持单字段排序,有朋友如果问为什么不做成可以多字段排序的,理论上确实有这种可能性,但需要以一定的效率损失为代价,而且会使方法过于复杂,如真有这种需要,完全可以写一个单独的分页存储过程,无论在性能还是复杂度上都比通用要简单.
     3) 对非unique字段排序的支持,但必须设定一个PK字段(注:只要是unique字段都可以作为pk字段)


  1存储过程分页(一)if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Paging_RowCount]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
  2存储过程分页(一)drop procedure [dbo].[Paging_RowCount]
  3存储过程分页(一)GO
  4存储过程分页(一)
  5存储过程分页(一)SET QUOTED_IDENTIFIER ON 
  6存储过程分页(一)GO
  7存储过程分页(一)SET ANSI_NULLS ON 
  8存储过程分页(一)GO
  9存储过程分页(一)---------------------------------------------------------------
 10存储过程分页(一)-- 分页存储过程(使用RowCount)  --edit by SiBen
 11存储过程分页(一)-- summary:
 12存储过程分页(一)--          获取表或表集合的分页数据
 13存储过程分页(一)--          当多表连接时,sort列必须指定表名
 14存储过程分页(一)---------------------------------------------------------------
 15存储过程分页(一)
 16存储过程分页(一)CREATE PROCEDURE Paging_RowCount
 17存储过程分页(一)(
 18存储过程分页(一)@Tables varchar(1000),
 19存储过程分页(一)@PK varchar(100),
 20存储过程分页(一)@Sort varchar(200) = NULL,
 21存储过程分页(一)@PageNumber int = 1,
 22存储过程分页(一)@PageSize int = 10,
 23存储过程分页(一)@Fields varchar(1000) = '*',
 24存储过程分页(一)@Filter varchar(1000) = NULL,
 25存储过程分页(一)@Group varchar(1000) = NULL,
 26存储过程分页(一)@RecordCount int = 0 output 
 27存储过程分页(一))
 28存储过程分页(一)AS
 29存储过程分页(一)
 30

http://www.codeproject.com/aspnet/PagingLarge.asp 

存储过程分页(一)邹建的存储过程
存储过程分页(一)ALTER PROC PageView
存储过程分页(一)@tbname     sysname,           --要分页显示的表名
存储过程分页(一)@FieldKey   sysname,           --用于定位记录的主键(惟一键)字段,只能是单个字段
存储过程分页(一)@PageCurrent int=1,             --要显示的页码
存储过程分页(一)@PageSize   int=10,            --每页的大小(记录数)
存储过程分页(一)@FieldShow  nvarchar(1000)='',  --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
存储过程分页(一)@FieldOrder  nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
存储过程分页(一)                                          --用于指定排序顺序
存储过程分页(一)@Where     nvarchar(1000)='',  --查询条件
存储过程分页(一)@PageCount  int OUTPUT        --总页数
存储过程分页(一)AS
存储过程分页(一)DECLARE @sql nvarchar(4000)
存储过程分页(一)SET NOCOUNT ON
存储过程分页(一)--检查对象是否有效
存储过程分页(一)IF OBJECT_ID(@tbname) IS NULL
存储过程分页(一)BEGIN
存储过程分页(一)RAISERROR(N'对象"%s"不存在',1,16,@tbname)
存储过程分页(一)RETURN
存储过程分页(一)END
存储过程分页(一)IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
存储过程分页(一)AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
存储过程分页(一)AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
存储过程分页(一)BEGIN
存储过程分页(一)RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
存储过程分页(一)RETURN
存储过程分页(一)END
存储过程分页(一)
存储过程分页(一)--分页字段检查
存储过程分页(一)IF ISNULL(@FieldKey,N'')=''
存储过程分页(一)BEGIN
存储过程分页(一)RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
存储过程分页(一)RETURN
存储过程分页(一)END
存储过程分页(一)
存储过程分页(一)--其他参数检查及规范
存储过程分页(一)IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
存储过程分页(一)IF ISNULL(@PageSize,0)<1 SET @PageSize=10
存储过程分页(一)IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
存储过程分页(一)IF ISNULL(@FieldOrder,N'')=N''
存储过程分页(一)SET @FieldOrder=N''
存储过程分页(一)ELSE
存储过程分页(一)SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
存储过程分页(一)IF ISNULL(@Where,N'')=N''
存储过程分页(一)SET @Where=N''
存储过程分页(一)ELSE
存储过程分页(一)SET @Where=N'WHERE ('+@Where+N')'
存储过程分页(一)
存储过程分页(一)--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
存储过程分页(一)IF @PageCount IS NULL
存储过程分页(一)BEGIN
存储过程分页(一)SET @sql=N'SELECT @PageCount=COUNT(*)'
存储过程分页(一)+N' FROM '+@tbname
存储过程分页(一)+N' '+@Where
存储过程分页(一)EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
存储过程分页(一)SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
存储过程分页(一)END
存储过程分页(一)
存储过程分页(一)--计算分页显示的TOPN值
存储过程分页(一)DECLARE @TopN varchar(20),@TopN1 varchar(20)
存储过程分页(一)SELECT @TopN=@PageSize,
存储过程分页(一)@TopN1=@PageCurrent*@PageSize
存储过程分页(一)
存储过程分页(一)--第一页直接显示
存储过程分页(一)IF @PageCurrent=1
存储过程分页(一)EXEC(N'SELECT TOP '+@TopN
存储过程分页(一)+N' '+@FieldShow
存储过程分页(一)+N' FROM '+@tbname
存储过程分页(一)+N' '+@Where
存储过程分页(一)+N' '+@FieldOrder)
存储过程分页(一)ELSE
存储过程分页(一)BEGIN
存储过程分页(一)SELECT @PageCurrent=@TopN1,
存储过程分页(一)@sql=N'SELECT @n=@n-1,@s=CASE WHEN @n<'+@TopN
存储过程分页(一)+N' THEN @s+N'',''+QUOTENAME(RTRIM(CAST('+@FieldKey
存储过程分页(一)+N' as varchar(8000))),N'''''''') ELSE N'''' END FROM '+@tbname
存储过程分页(一)+N' '+@Where
存储过程分页(一)+N' '+@FieldOrder
存储过程分页(一)SET ROWCOUNT @PageCurrent
存储过程分页(一)EXEC sp_executesql @sql,
存储过程分页(一)N'@n int,@s nvarchar(4000) OUTPUT',
存储过程分页(一)@PageCurrent,@sql OUTPUT
存储过程分页(一)SET ROWCOUNT 0
存储过程分页(一)IF @sql=N''
存储过程分页(一)EXEC(N'SELECT TOP 0'
存储过程分页(一)+N' '+@FieldShow
存储过程分页(一)+N' FROM '+@tbname)
存储过程分页(一)ELSE
存储过程分页(一)BEGIN
存储过程分页(一)SET @sql=STUFF(@sql,1,1,N'')
存储过程分页(一)--执行查询
存储过程分页(一)EXEC(N'SELECT TOP '+@TopN
存储过程分页(一)+N' '+@FieldShow
存储过程分页(一)+N' FROM '+@tbname
存储过程分页(一)+N' WHERE '+@FieldKey
存储过程分页(一)+N' IN('+@sql
存储过程分页(一)+N') '+@FieldOrder)
存储过程分页(一)END
存储过程分页(一)END

 

相关文章: