经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
SQLsever存储过程分页查询
来源:cnblogs  作者:LiuDanK  时间:2019/4/1 9:03:06  对本文有异议

使用存储过程实现分页查询,SQL语句如下:

  1. USE [DatebaseName] --数据库名
  2. GO
  3. /****** Object: StoredProcedure [dbo].[Pagination] Script Date: 03/30/2019 10:36:52 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. Create PROCEDURE [dbo].[Pagination]
  9. (
  10. @SqlTable varchar(1000),--要查询的表或视图,也可以一句sql语句
  11. @SqlPK varchar(50),--主键
  12. @SqlField varchar(1000),--查询的字段
  13. @SqlWhere varchar(1000)='', --查询条件
  14. @SqlOrder varchar(200),--排序
  15. @PageSize int=20,--每页的记录数
  16. @PageIndex int=1, --第几页,默认第一页
  17. @IsCount bit, --是否获取记录数
  18. @RecordCount int=0 output
  19. )
  20. AS
  21. SET NOCOUNT ON
  22. DECLARE @PageLowerBound int
  23. DECLARE @PageUpperBound int
  24. DECLARE @sqlstr nvarchar(2000)
  25. --获取记录数
  26. IF @IsCount=1
  27. BEGIN
  28. SET @sqlstr=N'select @sCount=count(1) FROM '+@SqlTable+' WHERE 1=1 '+@SqlWhere
  29. Exec sp_executesql @sqlstr,N'@sCount int outPut',@RecordCount OUTPUT
  30. END
  31. SET @PageLowerBound=(@PageIndex-1)*@PageSize
  32. SET @PageUpperBound=@PageLowerBound+@PageSize
  33. CREATE TABLE #pageindex(id int identity(1,1) not null,nid varchar(100))
  34. SET rowcount @PageUpperBound
  35. SET @sqlstr=N'insert into #pageindex(nid) select '+@SqlPK+' from '+@SqlTable+' where 1=1 '+@SqlWhere+' '+@SqlOrder
  36. Exec sp_executesql @sqlstr
  37. SET @sqlstr='select '+@SqlField+' FROM '+ @SqlTable +' inner join #pageindex p on '+@SqlPK+'=p.nid and (p.id>'+STR(@PageLowerBound)+') and (p.id<='+STR(@PageUpperBound)+')' +' '+@SqlOrder
  38. Exec sp_executesql @sqlstr
  39. SET NOCOUNT OFF
  40. DROP TABLE #pageindex

但是如果你有一些奇怪的需求,比如删除当前页数据之后不重新返回第一页,然后继续请求下一页,这时会出现有一下数据被跳过查询

解决方案如下:

  1. USE [DatebaseName]
  2. GO
  3. /****** Object: StoredProcedure [dbo].[Pagination] Script Date: 03/30/2019 14:41:39 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. CREATE PROCEDURE [dbo].[PaginationSkip]
  9. (
  10. @SqlTable varchar(1000),--要查询的表或视图,也可以一句sql语句
  11. @SqlPK varchar(50),--主键
  12. @SqlField varchar(1000),--查询的字段
  13. @SqlWhere varchar(1000)='', --查询条件
  14. @SqlOrder varchar(200),--排序
  15. @PageSize int=20,--每页的记录数
  16. @PageIndex int=1, --第几页,默认第一页
  17. @IsCount bit, --是否获取记录数
  18. @RecordCount int=0 output,
  19. @Skip int=0 --跳过记录数
  20. )
  21. AS
  22. SET NOCOUNT ON
  23. DECLARE @PageLowerBound int
  24. DECLARE @PageUpperBound int
  25. DECLARE @sqlstr nvarchar(2000)
  26. --获取记录数
  27. IF @IsCount=1
  28. BEGIN
  29. SET @sqlstr=N'select @sCount=count(1) FROM '+@SqlTable+' WHERE 1=1 '+@SqlWhere
  30. Exec sp_executesql @sqlstr,N'@sCount int outPut',@RecordCount OUTPUT
  31. END
  32. SET @PageLowerBound=(@PageIndex-1)*@PageSize-@Skip --减去删除的条数,以适应需求
  33. SET @PageUpperBound=@PageLowerBound+@PageSize-@Skip
  34. CREATE TABLE #pageindex(id int identity(1,1) not null,nid varchar(100))
  35. SET rowcount @PageUpperBound
  36. SET @sqlstr=N'insert into #pageindex(nid) select '+@SqlPK+' from '+@SqlTable+' where 1=1 '+@SqlWhere+' '+@SqlOrder
  37. Exec sp_executesql @sqlstr
  38. SET @sqlstr='select '+@SqlField+' FROM '+ @SqlTable +' inner join #pageindex p on '+@SqlPK+'=p.nid and (p.id>'+STR(@PageLowerBound)+') and (p.id<='+STR(@PageUpperBound)+')' +' '+@SqlOrder
  39. Exec sp_executesql @sqlstr
  40. SET NOCOUNT OFF
  41. DROP TABLE #pageindex
  42. GO

添加了一个 Skip 参数,来指示需要往前推进几条数据,这个参数就是你在请求之前删除的条数

原文链接:http://www.cnblogs.com/LiuDanK/p/10630220.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号