`
azheng270
  • 浏览: 90920 次
  • 性别: 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

分享到:
评论

相关推荐

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

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

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

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

    分页 SQLServer存储过程

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

    邹建大大笔记-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...

    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 Server2000开发与管理应用实例》书的实例完全源代码

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

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

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

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

    这是一个很好的数据库课件,很全面,而且有很多实在的例子,是初学者的最好助手。

    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 Server2000开发与管理应用实例源代码

    这是这本书配套的源代码,超级详细的!可以拿来直接看效果

    sql server 死锁处理

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

    解决字符长度8000限制

    解决字符长度8000限制 作者: 邹建 经常有人提到,用动态生成SQL语句的方法处理数据时,处理语句超长,无法处理的问题

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

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

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

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

    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