表中主键必须为标识列,[ID] int IDENTITY (1,1)
  1.分页方案一:(利用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
 
   2.分页方案二:(利用ID大于多少和SELECT TOP分页)
 
语句形式:  
 
SELECT TOP 10 *
 
FROM TestTable
 
WHERE (ID >
 
          (SELECT MAX(id)
 
         FROM (SELECT TOP 20 id
 
                 FROM TestTable
 
                 ORDER BY id) AS T))
 
ORDER BY ID
 


SELECT TOP 页大小 *
 
FROM TestTable
 
WHERE (ID >
 
          (SELECT MAX(id)
 
         FROM (SELECT TOP 页大小*页数 id
 
                 FROM 表
 
                 ORDER BY id) AS T))
 
ORDER BY ID


  3.分页方案三:(利用SQL的游标存储过程分页)

create  procedure SqlPager
 
@sqlstr nvarchar(4000), --查询字符串
 
@currentpage int, --第N页
 
@pagesize int --每页行数
 
as
 
set nocount on
 
declare @P1 int, --P1是游标的id
 
 @rowcount int
 
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output
 
select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页 
 
set @currentpage=(@currentpage-1)*@pagesize+1
 
exec sp_cursorfetch @P1,16,@currentpage,@pagesize 
 
exec sp_cursorclose @P1
 
set nocount off



其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。

通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页)   效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页)    效率最差,但是最为通用

CREATE PROCEDURE [dbo].[M13_UserCofferLogViewList_SearchUserCofferLogViewList](

 
@UserName varchar(256)  = null --用户登录名称,null不参与查询

 

      ,@NickName varchar(256)  = null --用户昵称,null不参与查询

 
,@AgentIDs varchar(8000)  = null --代理商ID集合,null不参与查询

 
,@OrderBy varchar(2000)='' --排序

 

      ,@PageIndex int = 1 --当前页

 
,@PageSize int = 20 --分页大小

 
,@TotalCount int  = 0 output --–返回总记录数

 

  )

 
 
 
 

  AS

 

  SET NOCOUNT ON

 

  declare @WhereClause nvarchar(4000),@sqlcount nvarchar(4000)

 

  set @WhereClause = ' 1 = 1 '

 

  +case when @UserName is null then '' else ' and (ToUserName  like ''%'+ @UserName +'%'') or ( FromUserName  like ''%'+ @UserName +'%'' ) ' end

 

  +case when @NickName is null then '' else ' and (ToNickName  like ''%'+ @NickName +'%'') or ( FromNickName  like ''%'+ @NickName +'%''  ) ' end

 

  +case when @AgentIDs is null then '' else ' and AgentID  in ('+ @AgentIDs +')' end

 
 
 
 

  declare @PageLowerBound int

 

  declare @PageUpperBound int

 
 
 
 

  SET @PageLowerBound = @PageSize * (@PageIndex-1)

 

  SET @PageUpperBound = @PageLowerBound + @PageSize

 
 
 
 

  -- 创建临时表

 

  Create Table #PageIndex

 

  (

 

      [IndexId] int IDENTITY (1, 1) NOT NULL,

 

      [AutoID] bigint 

 

  )

 
 
 
 

  declare @SQL as nvarchar(4000)

 

  SET @SQL = 'INSERT INTO #PageIndex (AutoID)'

 

  SET @SQL = @SQL + ' SELECT'

 

  IF @PageSize > 0

 

  BEGIN

 
SET @SQL = @SQL + ' TOP ' + convert(nvarchar, @PageUpperBound)

 

  END

 

  SET @SQL = @SQL + ' [AutoID]'

 

  SET @SQL = @SQL + ' FROM dbo.[UserCofferLogViewList]'

 

  IF LEN(@WhereClause) > 0

 

  BEGIN

 
SET @SQL = @SQL + ' WHERE ' + @WhereClause

 

  END

 

  IF LEN(@OrderBy) > 0

 

  BEGIN

 
SET @SQL = @SQL + ' ORDER BY ' + @OrderBy

 

  END

 
 
 
 

  -- Populate the temp table

 

  exec sp_executesql @SQL

 
 
 
 

  -- Return paged results

 

  SELECT O.*

 

  FROM

 

      dbo.[UserCofferLogViewList] O,

 

      #PageIndex PageIndex

 

  WHERE

 

      PageIndex.IndexID > @PageLowerBound

 
AND O.[AutoID] = PageIndex.[AutoID]

 

  ORDER BY

 

      PageIndex.IndexID

 
 
 
 

  -- get row count

 

  SET @SQL = 'SELECT @TotalCount = count(*)'

 

  SET @SQL = @SQL + ' FROM dbo.[UserCofferLogViewList]'

 

  IF LEN(@WhereClause) > 0

 

  BEGIN

 
SET @SQL = @SQL + ' WHERE ' + @WhereClause

 

  END

 
 
 
 

  --output count

 

  exec sp_executesql @SQL,N'@TotalCount int output',@TotalCount = @TotalCount output

 
 
 
 

  GO