当前位置:Gxlcms > mssql > MSSQL分页存储过程完整示例(支持多表分页存储)

MSSQL分页存储过程完整示例(支持多表分页存储)

时间:2021-07-01 10:21:17 帮助过:40人阅读

本文实例讲述了MSSQL分页存储过程。分享给大家供大家参考,具体如下:

  1. USE [DB_Common]
  2. GO
  3. /****** 对象: StoredProcedure [dbo].[Com_Pagination] 脚本日期: 03/09/2012 23:46:20 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. /************************************************************
  9. *
  10. *Sql分页存储过程(支持多表分页存储)
  11. *
  12. *调用实例:
  13. EXEC Com_Pagination 100, --总记录数
  14. 0, --总页数
  15. -- 'Person',--查询的表名
  16. '
  17. Person p
  18. LEFT JOIN TE a
  19. ON a.PID=p.Id
  20. ', --查询的表名(这里为多表)
  21. 'a.*', --查询数据列
  22. 'p.ID', --排列字段
  23. 'p.ID', --分组字段
  24. 2, --每页记录数
  25. 1, --当前页数
  26. 0, --是否使用分组,否是
  27. ' a.pid=2'--查询条件
  28. ************************************************************/
  29. CREATE PROCEDURE [dbo].[Com_Pagination]
  30. @TotalCount INT OUTPUT, --总记录数
  31. @TotalPage INT OUTPUT, --总页数
  32. @Table NVARCHAR(1000), --查询的表名(可多表,例如:Person p LEFT JOIN TE a ON a.PID=p.Id )
  33. @Column NVARCHAR(1000), --查询的字段,可多列或者为*
  34. @OrderColumn NVARCHAR(100), --排序字段
  35. @GroupColumn NVARCHAR(150), --分组字段
  36. @PageSize INT, --每页记录数
  37. @CurrentPage INT, --当前页数
  38. @Group TINYINT, --是否使用分组,否是
  39. @Condition NVARCHAR(4000) --查询条件(注意:若这时候为多表查询,这里也可以跟条件,例如:a.pid=2)
  40. AS
  41. DECLARE @PageCount INT, --总页数
  42. @strSql NVARCHAR(4000), --主查询语句
  43. @strTemp NVARCHAR(2000), --临时变量
  44. @strCount NVARCHAR(1000), --统计语句
  45. @strOrderType NVARCHAR(1000) --排序语句
  46. BEGIN
  47. SET @PageCount = @PageSize * (@CurrentPage -1)
  48. SET @strOrderType = ' ORDER BY ' + @OrderColumn + ' '
  49. IF @Condition != ''
  50. BEGIN
  51. IF @CurrentPage = 1
  52. BEGIN
  53. IF @GROUP = 1
  54. BEGIN
  55. SET @strCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @Table
  56. + ' WHERE ' + @Condition + ' GROUP BY ' + @GroupColumn
  57. SET @strCount = @strCount + ' SET @TotalCount=@@ROWCOUNT'
  58. SET @strSql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @Column
  59. + ' FROM ' + @Table + ' WHERE ' + @Condition +
  60. ' GROUP BY ' + @GroupColumn + ' ' + @strOrderType
  61. END
  62. ELSE
  63. BEGIN
  64. SET @strCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @Table
  65. + ' WHERE ' + @Condition
  66. SET @strSql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @Column
  67. + ' FROM ' + @Table + ' WHERE ' + @Condition + ' ' + @strOrderType
  68. END
  69. END
  70. ELSE
  71. BEGIN
  72. IF @GROUP = 1
  73. BEGIN
  74. SET @strCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @Table
  75. + ' WHERE ' + @Condition + ' GROUP BY ' + @GroupColumn
  76. SET @strCount = @strCount + ' SET @TotalCount=@@ROWCOUNT'
  77. SET @strSql = 'SELECT * FROM (SELECT TOP (2000) ' + @Column
  78. + ',ROW_NUMBER() OVER(' + @strOrderType +
  79. ') AS NUM FROM ' + @Table + ' WHERE ' + @Condition +
  80. ' GROUP BY ' + @GroupColumn +
  81. ') AS T WHERE NUM BETWEEN ' + STR(@PageCount + 1) +
  82. ' AND ' + STR(@PageCount + @PageSize)
  83. END
  84. ELSE
  85. BEGIN
  86. SET @strCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @Table
  87. + ' WHERE ' + @Condition
  88. SET @strSql = 'SELECT * FROM (SELECT TOP (2000) ' + @Column
  89. + ',ROW_NUMBER() OVER(' + @strOrderType +
  90. ') AS NUM FROM ' + @Table + ' WHERE ' + @Condition +
  91. ') AS T WHERE NUM BETWEEN ' + STR(@PageCount + 1) +
  92. ' AND ' + STR(@PageCount + @PageSize)
  93. END
  94. END
  95. END
  96. ELSE
  97. --没有查询条件
  98. BEGIN
  99. IF @CurrentPage = 1
  100. BEGIN
  101. IF @GROUP = 1
  102. BEGIN
  103. SET @strCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @Table
  104. + ' GROUP BY ' + @GroupColumn
  105. SET @strCount = @strCount + 'SET @TotalCount=@@ROWCOUNT'
  106. SET @strSql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @Column
  107. + ' FROM ' + @Table + ' GROUP BY ' + @GroupColumn + ' ' +
  108. @strOrderType
  109. END
  110. ELSE
  111. BEGIN
  112. SET @strCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @Table
  113. SET @strSql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @Column
  114. + ' FROM ' + @Table + ' ' + @strOrderType
  115. END
  116. END
  117. ELSE
  118. BEGIN
  119. IF @GROUP = 1
  120. BEGIN
  121. SET @strCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @Table
  122. + ' GROUP BY ' + @GroupColumn
  123. SET @strCount = @strCount + 'SET @TotalCount=@@ROWCOUNT'
  124. SET @strSql = 'SELECT * FROM (SELECT TOP (2000) ' + @Column
  125. + ',ROW_NUMBER() OVER(' + @strOrderType +
  126. ') AS NUM FROM ' + @Table + ' GROUP BY ' + @GroupColumn +
  127. ') AS T WHERE NUM BETWEEN ' + STR(@PageCount + 1) +
  128. ' AND ' + STR(@PageCount + @PageSize)
  129. END
  130. ELSE
  131. BEGIN
  132. SET @strCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @Table
  133. SET @strSql = 'SELECT * FROM (SELECT TOP (2000) ' + @Column
  134. + ',ROW_NUMBER() OVER(' + @strOrderType +
  135. ') AS NUM FROM ' + @Table + ') AS T WHERE NUM BETWEEN ' +
  136. STR(@PageCount + 1) + ' AND ' + STR(@PageCount + @PageSize)
  137. END
  138. END
  139. END
  140. EXEC sp_executesql @strCount,
  141. N'@TotalCount INT OUTPUT',
  142. @TotalCount OUTPUT
  143. IF @TotalCount > 2000
  144. BEGIN
  145. SET @TotalCount = 2000
  146. END
  147. IF @TotalCount%@PageSize = 0
  148. BEGIN
  149. SET @TotalPage = @TotalCount / @PageSize
  150. END
  151. ELSE
  152. BEGIN
  153. SET @TotalPage = @TotalCount / @PageSize + 1
  154. END
  155. SET NOCOUNT ON
  156. EXEC (@strSql)
  157. END
  158. SET NOCOUNT OFF
  159. /**调用实例:
  160. EXEC Com_Pagination 100, --总记录数
  161. 0, --总页数
  162. -- 'Person',--查询的表名
  163. '
  164. Person p
  165. LEFT JOIN TE a
  166. ON a.PID=p.Id
  167. ', --查询的表名(这里为多表)
  168. 'a.*', --查询数据列
  169. 'p.ID', --排列字段
  170. 'p.ID', --分组字段
  171. 2, --每页记录数
  172. 1, --当前页数
  173. 0, --是否使用分组,否是
  174. ' a.pid=2'--查询条件
  175. SELECT a.*
  176. FROM Person p
  177. LEFT JOIN TE a
  178. ON a.PID = p.Id
  179. WHERE a.pid = 2
  180. **/

希望本文所述对大家SQL Server数据库程序设计有所帮助。

您可能感兴趣的文章:

  • MS sqlserver 2008数据库转换成2000版本的方法
  • MSSql简单查询出数据表中所有重复数据的方法
  • PHP封装的MSSql操作类完整实例
  • 拯救你的数据 通过日志恢复MSSQL数据
  • MSSQL产生死锁的根本原因及解决方法
  • SQL(MSSQLSERVER)服务启动错误代码3414的解决方法
  • PHP连接MSSQL方法汇总
  • ASP.NET和MSSQL高性能分页实例代码
  • 如何处理Python3.4 使用pymssql 乱码问题
  • MS SQL 实现验证字符串是否包含有大小写字母的功能

人气教程排行