sql 分页

1. top分页法

select top pageSize from tb 

where ID not in (select top pageSize*pageIndex from tb)

 

select top pageSize from tb 

where ID > select Max(ID) from (select top pageSize*pageIndex from tb) as t

 

2. RowNum()

select * from (select row_number() over (order by ID) as rowNumber,* from tb) temp where rowNumber between pageSize*(pageIndex-1)+1 and pageSize*pageIndex

 

--1.myself

------------------------------------------------------------

USE HR;
GO
IF EXISTS(SELECT * FROM sys.objects WHERE NAME='usp_PagingProc')
DROP PROCEDURE usp_PagingProc
GO

--分页存储过程
Create PROC [dbo].[usp_PagingProc]
(
@searchColumn nvarchar(500) = '', --要查的列名
@tableName nvarchar(500) = '', --所查表名,包括left/right/inner join表
@condition nvarchar(500) = '', --条件
@sortColumn nvarchar(500) = '', --排序列
@isDesc bit = 0, --是否降序,1代表降序,0默认代表升序
@pageIndex int = 1, --当前页
@pageSize int = 10, --每页记录数
@totalNum int output --总记录数
)
as
declare @sqlSelect nvarchar(2500); --查询语句
declare @totalNumSelect nvarchar(3000); --数据行
declare @totalSelect nvarchar(4000); --总执行语句
DECLARE @orderByStr nvarchar(200); --排序语句

--处理排序
if(LEN(@sortColumn) > 0)
begin
IF(@isDesc = 1)
SET @orderByStr = 'order by '+ @sortColumn +' desc';
ELSE
SET @orderByStr = 'order by '+ @sortColumn +' asc';
end

--拼接查询语句
SET @sqlSelect='SELECT ROW_NUMBER() over(' + @orderByStr + ') as rowIndex,' + @searchColumn
+' FROM ' + @tableName
+ ' WHERE 1 = 1 ' + @condition;
--Print @sqlSelect + char(10);

--总记录数
SET @totalNumSelect='select @total=COUNT(1) FROM (' + @sqlSelect + ') t';
EXECUTE sp_executesql @totalNumSelect,N'@total int output',@totalNum OUTPUT;--查询总行数
PRINT '总记录数: ' + @totalNumSelect + char(10);

IF(@totalNum IS NULL)
SET @totalNum=0;

--总执行
SET @totalSelect='select * FROM (' + @sqlSelect + ') as t where t.rowIndex between '+convert(nvarchar(20), ((@pageIndex-1)*@pageSize+1))+' and '+convert(nvarchar(20),(@pageIndex*@pageSize));
PRINT '总执行: ' + @totalSelect + char(10);
EXEC(@totalSelect);
RETURN @totalNum;

--示例
--原sql查询所有
/*
select c.Id
,i.Name
,c.IndustryID
,c.[Company]
,c.[Office]
,c.[Salary]
,c.[Hiring]
,c.[Area]
,c.[SuccessNumber]
,c.[RecomDay]
,c.[RecomNumber]
,c.[SuccessDay]
,c.[Title]
,c.[Content]
from [dbo].[Case] c
left join Industry i on c.IndustryID = i.Id
where 1=1 and c.Id >= 3
go
*/

--执行存储过程
/*
declare @totalNum int; --总记录数
EXEC [dbo].[usp_PagingProc] 'c.Id,i.Name,c.IndustryID,c.[Company],c.[Office],c.[Salary],c.[Hiring],c.[Area],c.[SuccessNumber],c.[RecomDay],c.[RecomNumber],c.[SuccessDay],c.[Title],c.[Content]',
'[dbo].[Case] c left join Industry i on c.IndustryID = i.Id',
' and c.Id >= 3','c.Id',0,1,10,@totalNum output;
select @totalNum as 总记录数; --输出值: 总记录数
*/
go

------------------------------------------------------------

--2. 摘自网上

CREATE  PROCEDURE [dbo].[SP_EDM_PageAll]
 @TableName varchar(350),        --表名
 @Fields varchar(5000) = '*',    --字段名(全部字段为*)
 @OrderField varchar(5000),        --排序字段(必须!支持多字段)
 @sqlWhere varchar(5000) = Null,--条件语句(不用加where)
 @pageSize int,                    --每页多少条记录
 @pageIndex int = 1,         --指定当前为第几页
 @distinct VARCHAR(50)=NULL,   --去除重复值,注意只能是一个字段
 @top INT=NULL                --查询TOP,不传为全部
AS 
BEGIN
    Declare @sql nvarchar(4000);
    Declare @totalRecord int;    
    DECLARE @totalPage INT;
    --计算总记录数
 IF (@distinct IS NULL OR @distinct='')
 BEGIN
  IF  (@SqlWhere='' OR  @sqlWhere IS NULL)
    SET  @sql = 'select @totalRecord = count(1) from ' + @TableName
   ELSE
    SET @sql = 'select @totalRecord = count(1) from ' + @TableName + ' where ' + @sqlWhere
 END
 ELSE
 BEGIN
  IF  (@SqlWhere='' OR  @sqlWhere IS NULL)
    SET  @sql = 'select @totalRecord = count(distinct ' + @distinct + ') from ' + @TableName
   ELSE
    SET @sql = 'select @totalRecord = count(distinct ' + @distinct + ') from ' + @TableName + ' where ' + @sqlWhere
 END
    
    EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数       
  
    IF(@top>0)
    BEGIN
  --指定TOP 记录
  SET @Fields= 'top ' + CAST(@top AS VARCHAR(20)) + ' ' +  @Fields;
  --如果总记录数超过TOP数,设总记录数为TOP数
  IF(@totalRecord>@top) 
   SET @totalRecord=@top
 END
  
    --计算总页数
    SELECT @totalPage=CEILING((@totalRecord+0.0)/@PageSize)
    SELECT @totalRecord AS 'fldtotalRecord',@totalPage AS 'fldTotalPage'
 
 IF (@distinct IS NULL OR @distinct='')
 BEGIN
  IF (@SqlWhere='' or @sqlWhere IS NULL)
   SET @sql = 'Select * FROM (select ' + @Fields + ',ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId from ' + @TableName
  ELSE
   SET @sql = 'Select * FROM (select ' + @Fields + ',ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId from ' + @TableName + ' where ' + @SqlWhere    
 END
 ELSE
 BEGIN
  IF (@SqlWhere='' or @sqlWhere IS NULL)
   SET @sql = 'Select * FROM (select ' + @Fields + ',ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId from ' + @TableName
  ELSE
   SET @sql = 'Select * FROM (select ' + @Fields + ',ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId from ' + @TableName + ' where ' + @SqlWhere    
  SET @sql=@sql + ' GROUP BY ' + @distinct;
 END
    
     
    --处理页数超出范围情况

    IF @PageIndex<=0 
        SET @pageIndex = 1
    
   
 
     --处理开始点和结束点
    DECLARE @StartRecord INT 
    DECLARE @EndRecord int
    
    SET @StartRecord = (@pageIndex-1)*@PageSize + 1
    SET @EndRecord = @StartRecord + @pageSize - 1
 
     --继续合成sql语句
    SET @sql = @sql + ') as tempTable where rowId >=' + CONVERT(VARCHAR(50),@StartRecord) + ' and rowid<= ' +  CONVERT(VARCHAR(50),@EndRecord)
    print @sql
    Exec(@sql)
    
end

 

转载于:https://www.cnblogs.com/leyoyo/p/3937364.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 528. 按权重随机选择(前缀和+二分查找)

文章目录1. 题目2. 解题1. 题目 给定一个正整数数组 w &#xff0c;其中 w[i] 代表下标 i 的权重&#xff08;下标从 0 开始&#xff09;&#xff0c;请写一个函数 pickIndex &#xff0c;它可以随机地获取下标 i&#xff0c;选取下标 i 的概率与 w[i] 成正比。 例如&#xf…

boss直聘改回系统头像_BOSS 直聘找工作,消息却已读不回?| 在线求职5条避坑指南...

前几天在半撇私塾的求职群里&#xff0c;一个同学反馈&#xff1a;在 BOSS 直聘求职的时候&#xff0c;为什么总是被「已读不回」呢&#xff1f;就连逛豆瓣的上班小组&#xff0c;都能遇到这样的反馈&#xff1a;为什么会出现「已读不回」的情况呢&#xff1f;关于这个问题的答…

解决问题:Python调用cmd命令,出现中文乱码

一、前言&#xff1a; Python如何使用OS模块调用cmd 在os模块中提供了两种调用 cmd 的方法&#xff0c;os.popen() 和 os.system() os.system(cmd) 是在执行command命令时需要打开一个终端&#xff0c;并且无法保存command命令的执行结果。 os.popen(cmd,mode) 打开一个与c…

LeetCode 587. 安装栅栏 / LintCode 1152. 安装栅栏(凸包检测:排序+叉积正负判断+正反扫描+去重)

文章目录1. 题目2. 解题1. 题目 在一个二维的花园中&#xff0c;有一些用 (x, y) 坐标表示的树。 由于安装费用十分昂贵&#xff0c;你的任务是先用最短的绳子围起所有的树。 只有当所有的树都被绳子包围时&#xff0c;花园才能围好栅栏。 你需要找到正好位于栅栏边界上的树的…

arduino读取水位传感器的数据显示在基于i2c的1602a上_XSB-IC-S2智能水位监测仪-老友网...

XSB-IC-S2智能水位监测仪 多功能本身就是智能仪器仪表的一个特点。例如&#xff0c;为了设计速度较快和结构较复杂的数字系统&#xff0c;仪器生产厂家制造了具有脉冲发生器、频率合成器和任意波形发生器等功能的函数发生器。这种多功能的综合型产品不但在性能上(如准确度)比专…

七夕小案例:用代码给心爱的她画一个爱心

一、爱心示例&#xff1a; 二、开始写代码&#xff1a; /* * Hi。宝贝&#xff01; * 这么久了。还没和宝贝说过我的工作呢&#xff01; * 我是个前端工程师。俗称程序员。网页相关。 * 如这个页面。就是个什么也没有的网页。 * 我的工作就是给这种空白的页面加点儿东西。 * 嗯…

在asp.net 2.0中使用SqlBulkCopy类迁移数据

在asp.net 2.0中使用SqlBulkCopy类迁移数据 (转&#xff09; http://jackyrong.cnblogs.com/archive/2005/08/29/225521.html 我们经常要在一个表中将数据迁移到另一个表&#xff0c;当然&#xff0c;用的方法十分多了。在.net 2.0中&#xff0c;提供了一个sqlbulkcopy类&#…

小案例:13行python代码实现对微信进行推送消息

一、前言&#xff1a; Python可以实现给QQ邮箱、企业微信、微信等等软件推送消息&#xff0c;今天咱们实现一下Python直接给微信推送消息。 这里咱们使用了一个第三方工具pushplus 二、单人推送 实现步骤&#xff1a; 1、用微信注册一个此网站的账号 2、将token复制出来&am…

python书籍_Python书籍大汇总——入门到实战

学习Python的朋友们越来越多&#xff0c;当当网和京东上面的Python类编程书籍&#xff0c;也从几年前寥寥无几到现在多的不知道选哪本才好了的地步。无论是自学还是参加培训班跟着老师学习&#xff0c;我们都需要几本实用的Python书&#xff0c;系统全面的掌握Python编程的相关…

LeetCode 87. 扰乱字符串(记忆化递归 / DP)

文章目录1. 题目2. 解题2.1 记忆化递归2.2 动态规划1. 题目 给定一个字符串 s1&#xff0c;我们可以把它递归地分割成两个非空子字符串&#xff0c;从而将其表示为二叉树。 下图是字符串 s1 “great” 的一种可能的表示形式。 great/ \gr eat/ \ / \ g r e a…

信号量的分类

信号量的分类Mutual Exclusion Semaphores&#xff08;互斥&#xff09;&#xff1a;一种特殊的二进制信号量&#xff0c;专门针对互斥操作进行了优化。Binary Semaphores&#xff08;二进制&#xff09;&#xff1a;完成互斥、同步操作的最佳方式&#xff1b;速度最快&#xf…

问题总结:一个 list 使用 for 遍历,边循环边删除的问题

一、需求&#xff1a; 对一个 list 数据类型写一个循环删除的程序 二、问题 来&#xff0c;我们来看看代码跟效果&#xff1a; # 初始化一个 list 列表&#xff0c;为了下边的方便比较&#xff0c;我就使用跟 list 索引来做 list 的元素 datas [0,1,2,3,4]# 打印元素组&am…

cpu使用率_漫话性能:CPU使用率

序言CPU 使用率是最直观和最常用的系统性能指标&#xff0c;更是我们在排查性能问题时&#xff0c;通常会关注的第一个指标。节拍率为了维护 CPU 时间&#xff0c;Linux 通过事先定义的节拍率&#xff08;内核中表示为 HZ&#xff09;&#xff0c;触发时间中断&#xff0c;并使…

TensorFlow 2.0 - 自定义模型、训练过程

文章目录1. 自定义模型2. 学习流程学习于&#xff1a;简单粗暴 TensorFlow 2 1. 自定义模型 重载 call() 方法&#xff0c;pytorch 是重载 forward() 方法 import tensorflow as tf X tf.constant([[1.0, 2.0, 3.0],[4.0, 5.0, 6.0]]) y tf.constant([[10.0],[20.0]])clas…

谁动了我的产品

2014年3月中旬离开了自己奋斗三年的公司&#xff0c;这是一家海关政府公司&#xff0c;三年里无论是做项目需求分析、项目开发、项目测试、项目上线实施、项目上线跟踪、收集反馈、做项目版本修改&#xff0c;我和我的团队都在一个有非常明确目标、有非常明确思路的过程中&…

LeetCode 352. 将数据流变为多个不相交区间(map二分查找)

文章目录1. 题目2. 解题1. 题目 给定一个非负整数的数据流输入 a1&#xff0c;a2&#xff0c;…&#xff0c;an&#xff0c;…&#xff0c;将到目前为止看到的数字总结为不相交的区间列表。 例如&#xff0c;假设数据流中的整数为 1&#xff0c;3&#xff0c;7&#xff0c;2&…

windows键按了没反应_windows快捷键使用 - 小怜

1、总的参考图&#xff1a;2、ctrl的组合使用&#xff1a;1与shift键结合&#xff1a;2 ctrl shift del # 快速清除浏览器缓存记录3 ctrl shift N # 浏览器当中&#xff0c;快速打开无痕新窗口。chrome内核的应该都可以&#xff0c;chrome和新…

Python倒计时自动发微信(电脑版微信)

一、前言&#xff1a; Python倒计时自动发微信&#xff08;电脑版微信登录状态&#xff09; 二、主要思路及步骤&#xff1a; 1、先启动微信 2、定位到搜索框 3、搜索微信 4、进入聊天窗口 5、粘贴文本内容 6、发送 7、关闭微信窗口 三、代码&#xff1a; import …

Javascript日期函数使用需要注意地方

当我们需要获取未来某个时间的毫秒数时&#xff0c;可能第一时间想到的方法是 (new Date("2014-12-08 12:00:00")).getTime() 这个在方法在chrome下是会返回一个数字的。 但是在IE下返回的是一个NaN&#xff0c;是因为IE下认为 YYYY-mm-dd HH:ii:ss不是一个合理的日期…

python判断是工作日还是休息日

一、概述 最近在做数据分析&#xff0c;需要判断一个日期是否为工作日&#xff0c;节假日。 找到一个现成的插件&#xff0c;蛮好用的。 1.1、插件介绍 chinesecalendar PyPI 判断某年某月某一天是不是工作日/节假日。 1.2、安装 pip install chinese_calendar该模块常…