SQLServer数据库存储过程分页是怎样的

SQLServer数据库存储过程分页是怎样的,第1张

存储过程:create Procedure pname

( @pageIndex int,@pageSize)

as

select from tableName order by id

offset @pageIndex pageSize fetch next pageSize rows only

分页

sqlserver 在2008之前 使用 top 和 not int top 的方式来做分页

2008以后使用 row_number() 函数作为分页关键函数

2012使用 offset 1 fetch next 10 rows only

你问了2个问题,你可以优先把视图,存储过程,触发器等弄明白,分页是查询,在存储过程里可以写复杂的sql文,只是在运行时是预编译和参数化查询防止sql注入

pageNow代表当前页面,第一页。

第一部分:看一下分页的基本原理:

对上面的mysql语句说明:limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。文中还提到limit n性能是没问题的,因为只扫描n行。

第二部分:根据雅虎的几位工程师带来了一篇Efficient Pagination Using MySQL的报告内容扩展:在文中提到一种clue的做法,给翻页提供一些线索,比如还是SELECT FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是1020,最小的是1000,如果我们只提供上一页、下一页这样的跳转(不提供到第N页的跳转),那么在处理上一页的时候SQL语句可以是:

处理下一页的时候SQL语句可以是:

不管翻多少页,每次查询只扫描20行。

缺点是只能提供上一页、下一页的链接形式,但是我们的产品经理非常喜欢“上一页 1 2 3 4 5 6 7 8 9 下一页”这样的链接方式,怎么办呢?

如果LIMIT m,n不可避免的话,要优化效率,只有尽可能的让m小一下,我们扩展前面的clue做法,还是SELECT FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是2519,最小的是2500;

当是第10页的SQL如下:

比如要跳到第9页,SQL语句可以这样写:

比如要跳到第8页,SQL语句可以这样写:

原理还是一样,记录住当前页id的最大值和最小值,计算跳转页面和当前页相对偏移,由于页面相近,这个偏移量不会很大,这样的话m值相对较小,大大减少扫描的行数。其实传统的limit m,n,相对的偏移一直是第一页,这样的话越翻到后面,效率越差,而上面给出的方法就没有这样的问题。

SELECT top 1000 产品, SUM(CASE 季度 WHEN '第一季度' THEN 销售量 ELSE 0 END) AS 第一季度, SUM(CASE 季度 WHEN '第二季度' THEN 销售量 ELSE 0 END)

AS 第二季度, SUM(CASE 季度 WHEN '第三季度' THEN 销售量 ELSE 0 END) AS 第三季度

FROM Tables

GROUP BY 产品

加top 1000 这样怎麼样?

1、新建模板

新建模板mutipagecpt,为了加快展示速度,我们可以使用分页查询,获取每个产品的详细信息并计算产品对应的订单中的应付金额,因此添加数据集时查询SQL语句为select 产品产品ID,产品名称, 供应商ID , 类别ID, 单位数量, 产品单价, 产品库存量, 产品订购量,sum(应付金额) as 应付款项 from 产品,订单,订单明细 where 产品产品ID=订单明细产品ID and 订单明细订单ID=订单订单ID and 产品产品ID between 10(${page}-1)+1 and 10${page} group by 产品产品ID,产品名称, 供应商ID , 类别ID, 单位数量, 产品单价, 产品库存量, 产品订购量 order by 产品产品ID,设置参数page的默认值为1,首次看到的是第一页,只查询出第1~20条记录;若page参数为2时,查询出第21~40条记录,即第二页内容。

2、自定义上一页、下一页按钮

在单元格中求出上一页、下一页页码的值

自定义上、下一页按钮

点击模板>模板web属性>分页预览设置,选择为该模板单独设置,在工具栏中增加两个自定义按钮分别命名为上一页,下一页,是工具栏上只剩下如下图所示几个按钮。

3、第一页与最后一页处理

求出总页数

双击总数所在单元格d出数据列设置对话框,选择高级>自定义显示,在自定义中填入公式:roundup($$$/10,0)求出总页数。

将第一行的行高设置为0,或者是隐藏:

上一页按钮设置:选中上一页自定义按钮,点击自定义JavaScript,在js中填入

var page= $("tr[tridx=0]","divcontent-container")children()eq(0)html();  

if(page==0)//如果报表显示第一页,则上一页不可用

thissetEnable(false);

else

windowlocationhref="${servletURL}reportlet=doc/Advanced/multipagecpt&page="+page;

下一页按钮设置与上一页的js差不多,只需要获取B1的值就可以了,所以在js中填入

var page= $("tr[tridx=0]","divcontent-container")children()eq(1)html();  

var total=$("tr[tridx=0]","divcontent-container")children()eq(2)html();  

if(parseInt(page) > parseInt(total))//如果报表显示最后一页,则下一页不可用

{

thissetEnable(false);

}

else

windowlocationhref="${servletURL}reportlet=doc/Advanced/multipagecpt&page="+page;

分页预览即可查看效果

创建出你需要的属性比如在我的项目中我需要用到的:有当前的页码currentPage

当前的页显示的数量currentCount

你从数据库中查询得到的所有数据总和totalCount(这个你需要在dao层定义方法实现并把得到的数据返回给service层)

一共需要分多少页totalPage(这个需要你去计算通过查询所有的数据总和/currentCount,还用到了mathceil()方法)

最后生成setter和getter方法

以上就是关于SQLServer数据库存储过程分页是怎样的全部的内容,包括:SQLServer数据库存储过程分页是怎样的、MySql中查询语句实现分页功能,其中pageNow代表当前是第几页、SQL数据库分页等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9268391.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存