DNT的几个分页存储过程解析

在DNT安装时会创建一些存储过程,用于完成DNT的功能。

这些存储过程位于、upload_files\install\sqlscript\sqlserver文件夹中的setup2.2 - 2005.sql文件中。

其中的分页存储过程如下:

我认识存储过程这个东西不久,仔细看了下,注释出来.一直以为存储过程很高深,多看代码感觉也不过如此.就是一些函数而已

下边列举的4个分页存储过程,写法风格各不相同.

在算法上只有两种.一个使用了ROW_NUMBER() OVER ( ORDER BY [aid] DESC ) AS ROWID这个函数.另一个手动计算页码,将该页的所有数据以DESC的方式选到一个临时表中.再在这个表中搜索Top数据.然后返回.

从风格上讲,前两个使用了很多参数来组织语句,代码美观大方.后两个先组织了Sql字符串,加入搜索条件后才使用EXEC语句执行.代码乱七八糟的,不是很好看,但也实现了功能.

(1) dnt_getfavoriteslist  获取用户收藏的存储过程

这个存储过程用于查看用户收藏是的分页显示.返回一个包含帖子主题的表供前台调用

CREATE PROCEDURE [dnt_getfavoriteslist]    --分页获取收藏主题表

@uid INT ,     --用户ID

@pagesize INT ,  --页大小

@pageindex INT   --第几页

AS --SELECT [f].[uid],[f].[tid],[topics].[title],[topics].[poster],[topics].[postdatetime],[topics].[replies],[topics].[views],[topics].[posterid] FROM [dnt_favorites] [f] LEFT JOIN [dnt_topics] [topics]  ON   [f].[tid]=[topics].[tid] WHERE  [f].[typeid]=0 AND [f].[uid]=@uid

IF @pageindex = 1   --处理第一页

BEGIN

SELECT TOP ( @pagesize )   --因为是第一页,选择出前@pagesize就是所需要的内容

[uid] ,

[tid] ,

[title] ,

[poster] ,

[postdatetime] ,

[replies] ,

[views] ,

[posterid]

FROM    ( SELECT    [f].[uid] ,     --这个Select用于选出用户用户所有的收藏 [f]代表表[dnt_favorites],[topics]代表[dnt_topics]

--两个表连接起来查询出用户收藏的所有主题

[f].[tid] ,

[topics].[title] ,

[topics].[poster] ,

[topics].[postdatetime] ,

[topics].[replies] ,

[topics].[views] ,

[topics].[posterid]

FROM      [dnt_favorites] [f]    --此处设置f代表[dnt_favorites]

LEFT JOIN [dnt_topics] [topics] ON [f].[tid] = [topics].[tid]

WHERE     [f].[typeid] = 0

AND [f].[uid] = @uid

) favorites   --此处的favorites相当于一个表。From语句后边的SELECT语句选择出来的内容存放着这个表中

ORDER BY [tid] DESC

END

ELSE

BEGIN   --@pageindex不等于1,处理其他页

SELECT TOP ( @pagesize )     --不是第一页,需要对选择出来内容的范围加以约束。Where之后未约束

[uid] ,

[tid] ,

[title] ,

[poster] ,

[postdatetime] ,

[replies] ,

[views] ,

[posterid]

FROM    ( SELECT    [f].[uid] ,

[f].[tid] ,

[topics].[title] ,

[topics].[poster] ,

[topics].[postdatetime] ,

[topics].[replies] ,

[topics].[views] ,

[topics].[posterid]

FROM      [dnt_favorites] [f]

LEFT JOIN [dnt_topics] [topics] ON [f].[tid] = [topics].[tid]

WHERE     [f].[typeid] = 0

AND [f].[uid] = @uid

) f1

WHERE   [tid] < ( SELECT    MIN([tid])   --根据页大小和页序号设置TID的范围

FROM      ( SELECT TOP ( ( @pageindex - 1 )

* @pagesize )

[tid]

FROM      ( SELECT  [f].[uid] ,   --这里跟处理第一页一样,选择出所有收藏的内容作为一个表,供查询

[f].[tid] ,

[topics].[title] ,

[topics].[poster] ,

[topics].[postdatetime] ,

[topics].[replies] ,

[topics].[views] ,

[topics].[posterid]

FROM    [dnt_favorites] [f]

LEFT JOIN [dnt_topics] [topics] ON [f].[tid] = [topics].[tid]

WHERE   [f].[typeid] = 0

AND [f].[uid] = @uid

) f2

ORDER BY  [tid] DESC   --因为是DESC所以最上边的内容为需要找的对象

) AS tblTmp

)

ORDER BY [tid] DESC

END

GO

(2) dnt_getmyp_w_uploads 获取用户附件列表存储过程

CREATE PROCEDURE [dnt_getmyp_w_uploads]  --获取用户附件并分页

@uid INT ,

@pageindex INT ,    --输入页码

@pagesize INT       --输入每一页的大小

AS

DECLARE @startRow INT ,

@endRow INT

SET @startRow = ( @pageindex - 1 ) * @pagesize + 1         --计算查找数据的开始和结束行号

SET @endRow = @startRow + @pagesize - 1

SELECT  [ATTACHMENTS].[aid] ,

[ATTACHMENTS].[uid] ,

[ATTACHMENTS].[p_w_upload] ,

[ATTACHMENTS].[description] ,

[ATTACHMENTS].[downloads] ,

[ATTACHMENTS].[extname] ,

[ATTACHMENTS].[filename] ,

[ATTACHMENTS].[pid] ,

[ATTACHMENTS].[postdatetime] ,

[ATTACHMENTS].[tid]

FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY [aid] DESC ) AS ROWID ,  --这里的Select相当于一个表(后边加上as)

--相当于 select * from ATTACHMENTS where

--ATTACHMENTS是SELECT    ROW_NUMBER() OVER...的结果

--ROW_NUMBER()是一个函数,在这里的作用是给选择出来的结果加

--一个从1开始的连续增长的行号

--因为对于一个用户来讲,附件的aid是不连续的。

[dnt_myp_w_uploads].[aid] ,

[dnt_myp_w_uploads].[uid] ,

[dnt_myp_w_uploads].[p_w_upload] ,

[dnt_myp_w_uploads].[description] ,

[dnt_myp_w_uploads].[downloads] ,

[dnt_myp_w_uploads].[extname] ,

[dnt_myp_w_uploads].[filename] ,

[dnt_myp_w_uploads].[pid] ,

[dnt_myp_w_uploads].[postdatetime] ,

[dnt_myp_w_uploads].[tid]

FROM      [dnt_myp_w_uploads]

WHERE     [dnt_myp_w_uploads].[uid] = @uid

) AS ATTACHMENTS

WHERE   ROWID BETWEEN @startRow AND @endRow    --根据ATTACHMENTS起止行序号选择数据输出

GO

转载于:https://blog.51cto.com/wwwht/678850

Discuz!NT 代码阅读笔记(8)--DNT的几个分页存储过程解析相关推荐

  1. [置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  2. linux 协议栈 位置,[置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  3. BNN Pytorch代码阅读笔记

    BNN Pytorch代码阅读笔记 这篇博客来写一下我对BNN(二值化神经网络)pytorch代码的理解,我是第一次阅读项目代码,所以想仔细的自己写一遍,把细节理解透彻,希望也能帮到大家! 论文链接: ...

  4. 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(八)—— 模型训练-训练

    系列目录: 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(一)--数据 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(二)-- 介绍及分词 菜鸟笔记-DuReader阅读理解基线模 ...

  5. leveldb代码阅读笔记(一)

    leveldb代码阅读笔记 above all leveldb是一个单机的键值存储的内存数据库,其内部使用了 LSM tree 作为底层存储结构,支持多版本数据控制,代码设计巧妙且简洁高效,十分值得作 ...

  6. C++ Primer Plus 6th代码阅读笔记

    C++ Primer Plus 6th代码阅读笔记 第一章没什么代码 第二章代码 carrots.cpp : cout 可以拼接输出,cin.get()接受输入 convert.cpp 函数原型放在主 ...

  7. [原创]fetchmail代码阅读笔记---ESMTP的认证方式

    fetchmail代码阅读笔记---ESMTP的认证方式 作者: 默难 ( monnand@gmail.com ) 0    引言 fetchmail是Eric S. Raymond组织编写的一款全功 ...

  8. CNN去马赛克代码阅读笔记

    有的博客链接是之前几周写好的草稿,最近整理的时候才发布的 CNN去马赛克论文及代码下载地址 有torch,minimal torch和caffe三种版本 关于minimal torch版所做的努力,以 ...

  9. ORB-SLAM2代码阅读笔记(五):Tracking线程3——Track函数中单目相机初始化

    Table of Contents 1.特征点匹配相关理论简介 2.ORB-SLAM2中特征匹配代码分析 (1)Tracking线程中的状态机 (2)单目相机初始化函数MonocularInitial ...

最新文章

  1. 也许是东半球直接底气的分库分表实践了
  2. 【数字信号处理】傅里叶变换性质 ( 序列傅里叶变换共轭对称性质示例 | 证明 原序列实部 x_R(n) 的 傅里叶变换 是 原序列傅里叶变换 的 共轭对称序列 )
  3. Spring的事务管理1
  4. Java设计模式(二) -- 单例模式
  5. 16_Android生命周期再介绍,通过androidconfigChanges属性让界面旋转时不改变状态中保留的值
  6. 腾讯AI Lab推进医疗全流程覆盖:辅诊导诊精度再升级、布局三类病理AI研究
  7. java timezone id_java.util.TimeZone.setID()方法实例
  8. 关闭后天 树莓派_陪你一起玩树莓派-系统安装
  9. chrome 插件下载
  10. [工具]将xml文件转换为html显示
  11. MacBook NodeJS 下载 安装 配置环境变量 npm registry 配置
  12. 测试UDP端口连通性
  13. python xlwt使用_Python使用xlwt模块 操作Excel文件
  14. 【Pigeon源码阅读】RPC底层通信实现原理(八)
  15. 消费品图像识别|无人新零售背后的商品识别技术
  16. java幸运抽奖系统_java实现幸运抽奖系统
  17. 独家 | 爱奇艺如何用大数据助力娱乐工业革命?
  18. Python(x,y)
  19. python-正则表达式实例
  20. 重温:求知若饥,虚心若愚

热门文章

  1. revit插件怎么快速自动标高?可以使用有自动标高的revit插件来实现
  2. matlab simulink 代数环问题解决
  3. 强大的图文长微博工具 支持图文混排 支持美工字体
  4. 安装交叉编译工具:arm-himix200-linux
  5. 华为AC+AP普通配置
  6. 密码学:流加密法与块加密法
  7. 1108 String复读机(JAVA)
  8. 5个实用小技巧教你写出让用户欲罢不能的标题
  9. optimizer_features_enable
  10. python折叠次数计算、一张纸5毫米_一张纸折叠多次后会怎样?计算机模拟得出,它能突破宇宙范围...