通用的SQL数据分页存储过程

简介: CREATE PROCEDURE spGetPageOfRecords  @pageSize int = 20,                                      -- 分页大小  @currentPage int ,                          ...
CREATE  PROCEDURE spGetPageOfRecords
   @pageSize  int  =  20,                                       --  分页大小
   @currentPage  int ,                                   --  第几页
   @columns  varchar( 1000=  ' * ',                         --  需要得到的字段
   @tableName  varchar( 100),                                --  需要查询的表    
   @condition  varchar( 1000=  '',                       --  查询条件, 不用加where关键字
   @ascColumn  varchar( 100=  '',                        --  排序的字段名 (即 order by column asc/desc)
   @bitOrderType  bit  =  0,                                  --  排序的类型 (0为升序,1为降序)
   @pkColumn  varchar( 50=  ''                              --  主键名称

AS
BEGIN                                                                                    
   DECLARE  @strTemp  varchar( 300)
   DECLARE  @strSql  varchar( 5000)                             --  该存储过程最后执行的语句
   DECLARE  @strOrderType  varchar( 1000)                     --  排序类型语句 (order by column asc或者order by column desc)

   BEGIN
     IF  @bitOrderType  =  1                                         --  降序
       BEGIN
         SET  @strOrderType  =  '  ORDER BY  ' + @ascColumn + '  DESC '
         SET  @strTemp  =  ' <(SELECT min '
       END
     ELSE                                                                       --  升序
       BEGIN
         SET  @strOrderType  =  '  ORDER BY  ' + @ascColumn + '  ASC '
         SET  @strTemp  =  ' >(SELECT max '
       END

     IF  @currentPage  =  1                                                 --  第一页
       BEGIN
         IF  @condition  !=  ''
           SET  @strSql  =  ' SELECT TOP  ' + STR( @pageSize) + '   ' + @columns + '  FROM  ' + @tableName +
             '  WHERE  ' + @condition + @strOrderType
         ELSE
           SET  @strSql  =  ' SELECT TOP  ' + STR( @pageSize) + '   ' + @columns + '  FROM  ' + @tableName + @strOrderType
       END

     ELSE                                                                       --  其他页
       BEGIN
         IF  @condition  != ''
           SET  @strSql  =  ' SELECT TOP  ' + STR( @pageSize) + '   ' + @columns + '  FROM  ' + @tableName +
           '  WHERE  ' + @condition + '  AND  ' + @pkColumn + @strTemp + ' ( ' + @pkColumn + ' ) ' + '  FROM (SELECT TOP  ' + STR(( @currentPage - 1) * @pageSize) +
           '   ' + @pkColumn + '  FROM  '  +  @tableName  +  '  where  '  +  @condition + @strOrderType + ' ) AS TabTemp) ' + @strOrderType
         ELSE
           SET  @strSql  =  ' SELECT TOP  ' + STR( @pageSize) + '   ' + @columns + '  FROM  ' + @tableName +
           '  WHERE  ' + @pkColumn + @strTemp + ' ( ' + @pkColumn + ' ) ' + '  FROM (SELECT TOP  ' + STR(( @currentPage - 1) * @pageSize) + '   ' + @pkColumn +
           '  FROM  ' + @tableName + @strOrderType + ' ) AS TabTemp) ' + @strOrderType
       END

   END
  
   EXEC ( @strSql)
END 

 

执行代码如下:

--   Test Employees Table on Northwind database
EXEC spGetPageOfRecords  52' EmployeeID, LastName, FirstName, Title, City, Region, Country '' Employees '''' EmployeeID '0' EmployeeID '


--   Test Customers Table on Northwind database
EXEC spGetPageOfRecords  106' CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region, Country '' Customers '''' CustomerID '0' CustomerID '

 

 

目录
相关文章
|
5月前
|
SQL 人工智能 JSON
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
简介:本文整理自阿里云高级技术专家李麟在Flink Forward Asia 2025新加坡站的分享,介绍了Flink 2.1 SQL在实时数据处理与AI融合方面的关键进展,包括AI函数集成、Join优化及未来发展方向,助力构建高效实时AI管道。
897 43
|
5月前
|
SQL 人工智能 JSON
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
本文整理自阿里云的高级技术专家、Apache Flink PMC 成员李麟老师在 Flink Forward Asia 2025 新加坡[1]站 —— 实时 AI 专场中的分享。将带来关于 Flink 2.1 版本中 SQL 在实时数据处理和 AI 方面进展的话题。
366 0
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
|
6月前
|
SQL
SQL如何只让特定列中只显示一行数据
SQL如何只让特定列中只显示一行数据
|
10月前
|
SQL 自然语言处理 数据库
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
280 4
|
6月前
|
SQL
SQL中如何删除指定查询出来的数据
SQL中如何删除指定查询出来的数据
|
6月前
|
SQL 关系型数据库 MySQL
SQL如何对不同表的数据进行更新
本文介绍了如何将表A的Col1数据更新到表B的Col1中,分别提供了Microsoft SQL和MySQL的实现方法,并探讨了多表合并后更新的优化方式,如使用MERGE语句提升效率。适用于数据库数据同步与批量更新场景。
|
8月前
|
SQL 数据挖掘 关系型数据库
【SQL 周周练】一千条数据需要做一天,怎么用 SQL 处理电表数据(如何动态构造自然月)
题目来自于某位发帖人在某 Excel 论坛的求助,他需要将电表缴费数据按照缴费区间拆开后再按月份汇总。当时用手工处理数据,自称一千条数据就需要处理一天。我将这个问题转化为 SQL 题目。
298 12
|
7月前
|
SQL DataWorks 数据管理
SQL血缘分析实战!数据人必会的3大救命场景
1. 开源工具:Apache Atlas(元数据管理)、Spline(血缘追踪) 2. 企业级方案:阿里DataWorks血缘分析、腾讯云CDW血缘引擎 3. 自研技巧:在ETL脚本中植入版本水印,用注释记录业务逻辑变更 📌 重点总结:
|
8月前
|
存储 SQL 数据库连接
C#程序调用Sql Server存储过程异常处理:调用存储过程后不返回、不抛异常的解决方案
本文分析了C#程序操作Sql Server数据库时偶发的不返回、不抛异常问题,并提出了解决思路。首先解析了一个执行存储过程的函数`ExecuteProcedure`,其功能是调用存储过程并返回影响行数。针对代码执行被阻塞但无异常的情况,文章总结了可能原因,如死锁、无限循环或网络问题等。随后提供了多种解决方案:1) 增加日志定位问题;2) 使用异步操作提升响应性;3) 设置超时机制避免阻塞;4) 利用线程池分离主线程;5) 通过信号量同步线程;6) 监控数据库连接状态确保可用性。这些方法可有效应对数据库操作中的潜在问题,保障程序稳定性。
657 11
|
8月前
|
SQL Java 数据库连接
Java中实现SQL分页的方法
无论何种情况,选择适合自己的,理解了背后的工作原理,并能根据实际需求灵活变通的方式才是最重要的。
234 9