欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-16 19:33:46
...
  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