sql 分页rownumber方式

 alter procedure [dbo].[proc_getpaging]
(
 @TableName nvarchar(500),            --表名(可以为多表)
 @ReFieldsStr nvarchar(200) = ‘*‘,    --字段名(全部字段为*)
 @OrderString nvarchar(200),          --排序字段(支持多字段不用加order by)
 @OrderType nvarchar(4)=‘asc‘,                    --排序类型 (ASC DESC)
 @WhereString nvarchar(500) =N‘‘,     --条件语句(不用加where)
 @PageSize int,                       --每页多少条记录
 @PageIndex int = 1 ,                 --指定当前为第几页
 @TotalRecord int output ,            --返回总记录数
 @ErrorMsg nvarchar(500) output       --返回错误消息
)
as

begin
   begin try
    declare @StartRecord int;
    declare @EndRecord int;
    declare @TotalCountSql nvarchar(1000);
    declare @SqlString nvarchar(2000); 

    set @StartRecord = (@PageIndex-1)*@PageSize + 1
    set @EndRecord = @StartRecord + @PageSize - 1
    set @TotalCountSql= N‘select @TotalRecord = count(*) from ‘ + @TableName;--总记录数语句

    set @SqlString = N‘(select row_number() over (order by ‘+ @OrderString +‘ ‘+@OrderType+‘) as rowId,‘+@ReFieldsStr+‘ from ‘+ @TableName;
    if (@WhereString! = ‘‘ or @WhereString!=null)
        begin
            set @TotalCountSql=@TotalCountSql + ‘  where ‘+ @WhereString;
            set @SqlString =@SqlString+ ‘  where ‘+ @WhereString;
        end

    --第一次执行得到
    if(@TotalRecord is null)
     begin
           exec sp_executesql @TotalCountSql,N‘@TotalRecord int out‘,@TotalRecord output;
     end
    ----执行主语句
    set @SqlString =‘select * from ‘ + @SqlString + ‘) as t where rowId between ‘ + ltrim(str(@StartRecord)) + ‘ and ‘ +  ltrim(str(@EndRecord));
    exec(@SqlString)
    end try
    begin catch
    set @ErrorMsg = ERROR_MESSAGE()
    end catch
end

declare @total int
declare @msg nvarchar(100)
exec  proc_getpaging
‘Ritems,honor‘,‘Ritems.*‘,‘Ritems.itemname‘,‘asc‘,‘‘,2,1,@total output  ,@msg  output
print @total
print @msg

时间: 2024-12-28 17:10:02

sql 分页rownumber方式的相关文章

几种常见SQL分页方式效率比较-转

原文地址:几种常见SQL分页方式效率比较 分页很重要,面试会遇到.不妨再回顾总结一下. 1.创建测试环境,(插入100万条数据大概耗时5分钟). create database DBTestuse DBTest --创建测试表create table pagetest(id int identity(1,1) not null,col01 int null,col02 nvarchar(50) null,col03 datetime null) --1万记录集declare @i intset

SQL两种简单分页查询方式

以前我们或许都用过了linq的skip and take方式进行分页查询,但是很少自己写sql的分页查询,因为大多数时候,我们都是在调用别人的方法. 最近看到一个文档,感觉方法里面实现的分页查询进入数据库调用的时候,实际最底层调用的还是SQL的分页查询,例如,我们用linq写个分页查询,转成sql表达式后发现: 实际调用的时候,才发现SQL底层是这样进行分页的. 下面,本文主要是介绍两种SQL的分页查询. 一,TOP方式 ----第一种分页查询方式:TOP方式 declare @page int

常见的分页实现方式

1.MySql查询语句: --------  select * from t_student limit 0,10   从第一条开始查,查十条 2.PostgreSQL查询语句: select * form t_student limit 10 offset 0 3.Oracle查询语句 select * from ( select s.*, rownum rn from (select * from t_student) s where rownum<=10 ) where rn>=1; 4

sql分页性能测试结果

--方案一: declare @d datetime set @d = getdate() select top 10 * from Info where ID not in (select top 9990 ID from Info order by ID) order by ID select [not in方法升序分页执行花费时间(毫秒)]=datediff(ms,@d,getdate()) --430ms --方案二: declare @s datetime set @s = getda

SQL点滴16—SQL分页语句总结

原文:SQL点滴16-SQL分页语句总结 今天对分页语句做一个简单的总结,他们大同小异的,只要理解其中一个其他的就很好理解了. 使用top选项 selecttop10*from Orders a where a.orderid notin(selecttop10 orderid from Orders orderby orderid) orderby a.orderid 使用max函数 这种方法的前提是有唯一值的一个列. selecttop10*from Orders a where a.ord

SQL分页语句详解

SQL分页语句 有关分页 SQL 的资料很多,有的使用存储过程,有的使用游标.本人不喜欢使用游标,我觉得它耗资.效率低:使用存储过程是个不错的选择,因为存储过程是经过预编译的,执行效率高,也更灵活.先看看单条 SQL 语句的分页 SQL 吧. 方法1: 适用于 SQL Server 2000/2005 SELECT TOP 页大小 *FROM table1WHERE id NOT IN           (           SELECT TOP 页大小*(页数-1) id FROM tab

sql 分页查询

数据过多时sql中返回数据,开销大,用户还不一定会用到.这时使用sql分页查询,更具用户操作返回对应的数据就能极大程度提高效率. 分页有多种方法:top in.exist.row_number()等,在此只叙述相对高效的 max/top  分页方式 1.原始的 select * from dbo.pagetest where id >(select max(id) from (select top(9900) id from dbo.pagetest order by id)a) order b

[转]关于SQL分页存储过程的分析

[转]关于SQL分页存储过程的分析 建立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在内存中,很费内存.游标一建立,就将相关的记录锁住,直到取消游标.游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的不同进行不同的操作.而对于多表和大表中定义的游标(大的数据集合

真正通用的SQL分页存储过程

关于SQL分页的问题,网上找到的一些SQL其实不能真正做到通用,他们主要是以自增长ID做为前提的.但在实际使用中,很多表不是自增长的,而且主键也不止一个字段,其实我们稍做改进就可以达到通用.这里还增加了索引,以方便大数据量的使用(代码中是先抓到临时表的,从性能上说如果采用自增长式的ID表,当然可以不使用临时表以达到性能的提升).以下代码的SP是经过我们项目使用通过的.因朋友问及此问题,我就放在这里供大家分享,如各位大侠有更好的方法,也请告诉我.在这里先感谢各位了. 1 CREATE PROCED