sqlserver分页的几种写法

1.使用游标(sqlserver 2000以上)
declare @sqlstr varchar(2000)
declare @p1 int
select @sqlstr='select * from jfdata' 
exec sp_cursoropen @p1 output,@sqlstr
exec sp_cursorfetch @p1,16,200,100
exec sp_cursorclose @p1

--sqlserver2005与2008可用
with cte as (select ROW_NUMBER() over (order by stdid) as rownum,* from jfdata)
  select * from cte where rownum>100 and rownum<200

select * from (select row_number() over(order by stdid asc) row_num,* from jfdata) a where a.row_num>200 and a.row_num<300  


--sqlserver2012可用

select * from jfdata order by stdid offset 200 row fetch next 100 rows only
select @@ROWCOUNT

--分页存储过程

CREATE PROCEDURE dbo.P_GetPageData (   @tblName   varchar(255),      -- 表名   @strGetFields varchar(1000) = '*', -- 需要返回的列    @fldName varchar(255)='',     -- 排序的字段名   @PageSize   int = 10,         -- 页尺寸   @PageIndex  int = 1,          -- 页码   @doCount  bit = 0,  -- 返回记录总数,非 0 值则返回   @OrderType bit = 0, -- 设置排序类型,非 0 值则降序   @strWhere  varchar(1500) = ''  -- 查询条件 (注意: 不要加 where) ) AS   declare @strsql   varchar(5000)       -- 主语句   declare @strTmp   varchar(110)        -- 临时变量   declare @strOrder varchar(400)        -- 排序类型   if @doCount != 0     begin       if @strWhere !=''         set @strsql = 'select count(*) as Total from [' + @tblName + '] where '+@strWhere       else         set @strsql = 'select count(*) as Total from [' + @tblName + ']'     end      else--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况     begin       if @OrderType != 0         begin           set @strTmp = '<(select min'           set @strOrder = ' order by [' + @fldName +'] desc'           --如果@OrderType不是0,就执行降序,这句很重要!         end       else         begin           set @strTmp = '>(select max'           set @strOrder = ' order by [' + @fldName +'] asc'         end       if @PageIndex = 1         begin           if @strWhere != ''                 set @strsql = 'select top '+ str(@PageSize) +' '+@strGetFields+ '  from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder           else              set @strsql = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from ['+ @tblName + '] '+ @strOrder              --如果是第一页就执行以上代码,这样会加快执行速度         end       else         begin           --以下代码赋予了@strsql以真正执行的sql代码           set @strsql = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from ['              + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['              + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['              + @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'+ @strOrder           if @strWhere != ''           set @strsql = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from ['              + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['              + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['              + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '              + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder         end      end      exec (@strsql) GO

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...