`
azheng270
  • 浏览: 92942 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

邹建的 sql server 分页存储过程 以备用

阅读更多
  1. IFOBJECT_ID(N'dbo.pagination')ISNOTNULL
  2. DROPPROCEDUREdbo.pagination
  3. GO
  4. /**//*--实现分页的通用存储过程
  5. 显示指定表、视图、查询结果的第X页
  6. 对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法
  7. 如果视图或查询结果中有主键,不推荐此方法
  8. 如果使用查询语句,而且查询语句使用了orderby,则查询语句必须包含top语句
  9. 最后更新时间:2008.01.20
  10. --邹建2003.09(引用请保留此信息)--*/
  11. /**//*--调用示例
  12. EXECdbo.pagination
  13. @QueryStr=N'tb',
  14. @PageSize=5,
  15. @PageCurrent=3,
  16. @FdShow='id,colid,name',
  17. @FdOrder='colid,name'
  18. selectid,colidfromtb
  19. orderbycolid,name
  20. EXECdbo.pagination
  21. @QueryStr=N'
  22. SELECTTOP100PERCENT
  23. *
  24. FROMdbo.sysobjects
  25. ORDERBYxtype',
  26. @PageSize=5,
  27. @PageCurrent=2,
  28. @FdShow='name,xtype',
  29. @FdOrder='xtype,name'
  30. --*/
  31. CREATEPROCdbo.pagination
  32. @QueryStrnvarchar(4000),--表名、视图名、查询语句
  33. @PageSizeint=10,--每页的大小(行数)
  34. @PageCurrentint=1,--要显示的页
  35. @FdShownvarchar(4000)=N'',--要显示的字段列表,如果查询结果不需要标识字段,需要指定此值,且不包含标识字段
  36. @FdOrdernvarchar(1000)=N''--排序字段列表
  37. AS
  38. SETNOCOUNTON
  39. DECLARE
  40. @FdNamesysname,--表中的主键或表、临时表中的标识列名
  41. @Id1sysname,--开始和结束的记录号
  42. @Id2sysname,
  43. @Obj_IDint--对象ID
  44. --表中有复合主键的处理
  45. DECLARE
  46. @strfdnvarchar(2000),--复合主键列表
  47. @strjoinnvarchar(4000),--连接字段
  48. @strwherenvarchar(2000)--查询条件
  49. SELECT
  50. @Obj_ID=OBJECT_ID(@QueryStr),
  51. @FdShow=CASE
  52. WHEN@FdShow>N''THENN''+@FdShow
  53. ELSEN'*'
  54. END,
  55. @FdOrder=CASE
  56. WHEN@FdOrder>N''THENN'ORDERBY'+@FdOrder
  57. ELSEN''
  58. END,
  59. @QueryStr=CASE
  60. WHEN@Obj_IDISNULLTHENN'('+@QueryStr+N')A'
  61. ELSEN''+@QueryStr
  62. END
  63. --如果显示第一页,可以直接用top来完成
  64. IF@PageCurrent=1
  65. BEGIN
  66. SELECT
  67. @Id1=CAST(@PageSizeasvarchar(20))
  68. EXEC(N'
  69. SELECTTOP'+@Id1+N'
  70. '+@FdShow+N'
  71. FROM'+@QueryStr+N'
  72. '+@FdOrder
  73. )
  74. RETURN
  75. END
  76. --如果是表,则检查表中是否有标识更或主键
  77. IF@Obj_IDISNULLOROBJECTPROPERTY(@Obj_ID,'IsTable')=0
  78. GOTOlb_usetemp
  79. ELSE
  80. BEGIN
  81. SELECT
  82. @Id1=CAST(@PageSizeasvarchar(20)),
  83. @Id2=CAST((@PageCurrent-1)*@PageSizeasvarchar(20))
  84. --标识列
  85. SELECT
  86. @FdName=name
  87. FROMdbo.syscolumns
  88. WHEREid=@Obj_ID
  89. ANDstatus=0x80
  90. IF@@ROWCOUNT=0--如果表中无标识列,则检查表中是否有主键
  91. BEGIN
  92. DECLARE
  93. @pk_numberint
  94. SELECT
  95. @strfd=N'',
  96. @strjoin=N'',
  97. @strwhere=N''
  98. SELECT
  99. @strfd=@strfd
  100. +N','+QUOTENAME(name),
  101. @strjoin=@strjoin
  102. +N'ANDA.'+QUOTENAME(name)
  103. +N'=B.'+QUOTENAME(name),
  104. @strwhere=@strwhere
  105. +N'ANDB.'+QUOTENAME(name)+N'ISNULL'
  106. FROM(
  107. SELECT
  108. IX.id,IX.indid,
  109. IXC.colid,ixc.keyno,
  110. C.name
  111. FROMdbo.sysobjectsO,
  112. dbo.sysindexesIX,
  113. dbo.sysindexkeysIXC,
  114. dbo.syscolumnsC
  115. WHEREO.parent_obj=@Obj_ID
  116. ANDO.xtype='PK'
  117. ANDO.name=IX.name
  118. ANDIX.id=@Obj_ID
  119. ANDIX.id=IXC.id
  120. ANDIX.indid=IXC.indid
  121. ANDIXC.id=C.id
  122. ANDIXC.colid=C.colid
  123. )A
  124. ORDERBYkeyno
  125. SELECT
  126. @pk_number=@@ROWCOUNT,
  127. @strfd=STUFF(@strfd,1,1,N''),
  128. @strjoin=STUFF(@strjoin,1,5,N''),
  129. @strwhere=STUFF(@strwhere,1,5,N'')
  130. IF@pk_number=0
  131. GOTOlb_usetemp--如果表中无主键,则用临时表处理
  132. ELSEIF@pk_number=1
  133. BEGIN
  134. SELECT
  135. @FdName=@strfd
  136. GOTOlb_useidentity--使用单一主键
  137. END
  138. ELSE
  139. GOTOlb_usepk--使用复合主键
  140. END
  141. END
  142. /**//*--使用标识列或主键为单一字段的处理方法--*/
  143. lb_useidentity:
  144. EXEC(N'
  145. SELECTTOP'+@Id1+N'
  146. '+@FdShow+N'
  147. FROM'+@QueryStr+N'
  148. WHERE'+@FdName+'NOTIN(
  149. SELECTTOP'+@Id2+N'
  150. '+@FdName+'
  151. FROM'+@QueryStr+N'
  152. '+@FdOrder+N')
  153. '+@FdOrder+N'
  154. ')
  155. RETURN
  156. /**//*--表中有复合主键的处理方法--*/
  157. lb_usepk:
  158. EXEC(N'
  159. SELECT
  160. '+@FdShow+N'
  161. FROM(
  162. SELECTTOP'+@Id1+N'
  163. A.*
  164. FROM'+@QueryStr+N'A
  165. LEFTJOIN(
  166. SELECTTOP'+@Id2+N'
  167. '+@strfd+N'
  168. FROM'+@QueryStr+N'
  169. '+@FdOrder+N'
  170. )B
  171. ON'+@strjoin+N'
  172. WHERE'+@strwhere+N'
  173. '+@FdOrder+N'
  174. )A
  175. '+@FdOrder+N'
  176. ')
  177. RETURN
  178. /**//*--用临时表处理的方法--*/
  179. lb_usetemp:
  180. SELECT
  181. @FdName=QUOTENAME(N'ID_'+CAST(NEWID()asvarchar(40))),
  182. @Id1=CAST(@PageSize*(@PageCurrent-1)asvarchar(20)),
  183. @Id2=CAST(@PageSize*@PageCurrent-1asvarchar(20))
  184. EXEC(N'
  185. SELECT
  186. '+@FdName+N'=IDENTITY(int,0,1),
  187. '+@FdShow+N'
  188. INTO#tb
  189. FROM(
  190. SELECTTOP100PERCENT
  191. *
  192. FROM'+@QueryStr+N'
  193. '+@FdOrder+N'
  194. )A
  195. '+@FdOrder+N'
  196. SELECT
  197. '+@FdShow+N'
  198. FROM#tb
  199. WHERE'+@FdName+'BETWEEN'+@Id1+'AND'+@Id2+N'
  200. '
  201. )
  202. GO

分享到:
评论

相关推荐

    两个分页存储过程的效率比较

    在数据库管理中,分页存储过程是用于处理大量数据并以分页形式展示结果的常见技术。这篇讨论涉及两个分页存储过程的效率比较,其中一个示例存储过程名为`p_page`。`p_page`存储过程的设计允许用户灵活地指定查询参数...

    sql server存储过程导出数据到Access文件

    sql server存储过程导出数据到Access文件 原版来源于邹建版本,稍有修改 sql server存储过程导出数据到Access文件

    分页 SQLServer存储过程

    /*–用存储过程实现的分页程序 显示指定表、视图、查询结果的第X页 对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法 如果视图或查询结果中有主键,不推荐此方法 –邹建 2003.09–*/ /*–...

    (邹建)中文版+SQL+Server+2000+开发与管理应用实例.源码.rar

    2. **数据库架构**:介绍SQL Server 2000的数据库结构,如表、视图、索引、存储过程、触发器等基本元素,以及它们在数据库设计中的作用。 3. **Transact-SQL(T-SQL)**:这是SQL Server的扩展SQL语法,用于查询、...

    邹建大大笔记-sqlserver2000.rar

    邹建-中文版SQL Server2000开发与管理应用实例 一书的目录,可以对照一下 第 1 章 安装和配置SQL Server 1 1.1 SQL Server的版本和版本选择 1 1.2 安装SQL Server的常见问题 3 1.3 如何理解实例 5 ...

    邹建的分页存储过程改了一下

    邹建的分页存储过程–改了一下 因为邹建的分页存储过程不能返回记录总数,所以每次分页还又要统计一次,所以自己在里面加了个返回记录数,这下就好用了。 @iPageCount int OUTPUT –定义输出变量,放在@QueryStr...

    邹建 -《中文版SQL Server2000开发与管理应用实例》书的实例完全源代码

    《中文版SQL Server 2000开发与管理应用实例》是邹建撰写的一本专为SQL Server初学者和开发者提供的实战指南。这本书通过丰富的实例,深入浅出地讲解了SQL Server 2000的核心功能和实际操作技巧,旨在帮助读者掌握...

    SQLServer2000邹建开发实例脚本

    csdn sql server版块超级大版主的开发实例,共15章,包括安装和配置SQL Server、日期处理、字符处理、排序规则、编号处理、数据统计与汇总、分页处理、树形数据处理、数据导入与导出、作业、数据备份与还原。

    邹建 - 中文版SQL SERVER 2000开发与管理应用实例 1

    邹建老师写的《中文版SQL SERVER 2000开发与管理应用实例》。邹健的大名,应该都知道的吧。这本书不怎么清晰,想看清晰的,还是买一下他的书吧。也是对别人劳动的尊重。

    SQL SERVER 2000开发与管理应用实例

    7.2.4 使用SQL Server的系统存储过程处理分页 216 7.3 特殊要求的分页处理 217 7.3.1 随机显示的分页处理 217 7.3.2 分类数据的分页处理 221 第 8 章 树形数据处理 223 8.1 单编号处理法 223 ...

    SQL Server 2005中文版关系数据库基础与实践教程

    存储过程是预编译的SQL语句集合,可提高执行效率,减少网络流量,并封装复杂的业务逻辑。触发器则是在特定数据库操作(如INSERT、UPDATE、DELETE)发生时自动执行的程序,常用于实现业务规则和约束。 安全性是...

    SQL Server2000开发与管理应用实例源代码

    源代码中包含了大量T-SQL示例,如SELECT、INSERT、UPDATE和DELETE语句,以及存储过程和触发器的创建。 2. **数据库设计**:实例源代码涵盖了数据库表的设计,包括主键、外键、索引和约束的使用,这有助于理解如何...

    Server2000开发与管理应用实例[电子书_Part1]

    csdn sql 版主 邹建 编 你能找到这,不用我详细说明了吧 里面有3个文件 1.Server2000开发与管理应用实例.pdf 2.SQLServer2000开发,管理与应用实例(对应书的代码) 3.深入浅出SQL Server 2005开发,管理与应用实例(这...

    Server2000开发与管理应用实例[电子书_Part2]

    csdn sql 版主 邹建 编 你能找到这,不用我详细说明了吧 里面有3个文件 1.Server2000开发与管理应用实例.pdf 2.SQLServer2000开发,管理与应用实例(对应书的代码) 3.深入浅出SQL Server 2005开发,管理与应用实例(这...

    sql server 死锁处理

    很多朋友都遇到过sql死锁问题,本文档就是关于如何解决死锁问题的

    数据库管理与应用-1期 网络资源链接.pdf

    6. CSDN邹建的SQL Server博客(http://blog.csdn.net/zjcxc/):CSDN是中国最大的开发者社区之一,邹建的博客是个人专家分享SQL Server知识的平台,有大量实战经验和技巧。 7. CSDN数据库专区...

    sql处理数据库锁的存储过程分享

    邹建 2004.4 代码如下: /*–调用示例 exec p_lockinfo1 –*/ alter proc p_lockinfo1 @kill_lock_spid bit=1, –是否杀掉死锁的进程,1 杀掉, 0 仅显示 @show_spid_if_nolock bit=1 –如果没有死锁的进程,是否显示...

    Server2000开发与管理应用实例[电子书_Part3]

    csdn sql 版主 邹建 编 你能找到这,不用我详细说明了吧 里面有3个文件 1.Server2000开发与管理应用实例.pdf 2.SQLServer2000开发,管理与应用实例(对应书的代码) 3.深入浅出SQL Server 2005开发,管理与应用实例(这...

    sql全角半角

    转换说明 全角字符从的unicode编码从65281~65374 半角字符从的unicode编码从 33~126 空格比较特殊,全角为 12288,半角为 32 而且除空格外,全角/半角按unicode编码排序在顺序...--邹建 2005.01(引用请保留此信息)--*/

    溅射工艺对晶片碎片的影响

    关键词:溅射:辉光放电:溅射沉积功率中图分类号:TN305.92 文献标识码:A 文章编号:1003-353X(2004)04-0019-021 引言在半导体晶片制造过程中,一个重要的工序环节就是金属薄膜沉积,该工艺是作为电路引线用。...

Global site tag (gtag.js) - Google Analytics