大家好,在分页的时候这样写:
select CustomerID,CustomerName from (select CustomerID,CustomerName,row_number() over (order by CustomerID desc) as num from tbl_bus_customer)a where num>@startindex and num<@endindex
startindex 和 endindex 是:取从startindex 到endindex的数据。
不明白之处:在子查询里 select CustomerID,CustomerName,row_number() over (order by CustomerID desc) as num from tbl_bus_customer 会把外面的条件加进去吗,如果不加进去,那在子查询里还不是要全表查询,大数据量时有效果吗?

解决方案 »

  1.   

    可以使用条件
    SELECT TOP(分页大小) * 
    FROM 
    (
    SELECT ROW_NUMBER() OVER (ORDER BY 排序条件) AS RowNo FROM 数据表
    ) AS T
    WHERE RowNo > ((目前页数 - 1) * 分页大小) 
     ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    goCREATE PROCEDURE [dbo].[ShowPage]
    @tblName   varchar(255),       
    @strGetFields varchar(1000) = '*',  
    @strOrder varchar(255)='',     
    @PageSize   int = 10,         
    @PageIndex  int = 1,           
    @strWhere  varchar(1500) = ''  
    AS
    declare @strSQL   varchar(5000)
    if @strWhere !=''
      set @strWhere=' where '+@strWhere
    set @strSQL='SELECT * FROM (SELECT ROW_NUMBER() OVER ('+@strOrder+') AS pos,'+@strGetFields+' FROM ['+@tblName+']'+@strWhere+') AS sp WHERE pos BETWEEN '+str((@PageIndex-1)*@PageSize+1)+' AND '+str(@PageIndex*@PageSize)exec (@strSQL)
      

  2.   

    绑定在GridView会快点,自己写下分页控件,效率会高.