【数据库】Sql Server 2022通过临时表和游标遍历方式逻辑处理获取目标数据

2023年,第39周。给自己一个目标,然后坚持总会有收货,不信你试试!
今天有个小伙伴咨询一个Sql Server处理数据的问题,刚好重温下SqlServer临时表和游标的知识点

目录

  • 一、需求点描述
  • 二、临时表
    • 2.1、局部临时表(Local Temporary Table)
    • 2.2、全局临时表(Global Temporary Table)
  • 三、游标
    • 3.1、声明游标
    • 3.2、打开游标
    • 3.3、获取数据
    • 3.4、处理数据
    • 3.5、关闭和释放游标
  • 四、解决方案

在这里插入图片描述

一、需求点描述

有如下数据集,有9条记录,如果001前后一条记录都不是001,那么就取001前面一条记录以及本身001这条记录、
如果001下一条记录还是001,则取001最后一条记录以及001刚开始的前一条记录

工作中心序号备注
10011
10022取这条记录
0013取这条记录
10044
10085取这条记录
0016连续出现的首条前一条记录
0017
0018取这条记录
10099

1)查询数据集在这里插入图片描述

2)目标数据集在这里插入图片描述

二、临时表

在 SQL Server 中,临时表是一种用于存储临时数据的特殊表。
临时表可以在查询执行期间被创建,并且只在当前会话或连接有效。
它们对于需要存储临时数据的计算和操作非常有用。

SQL Server 提供了两种类型的临时表:局部临时表(Local Temporary Table)和全局临时表(Global Temporary Table)。

2.1、局部临时表(Local Temporary Table)

局部临时表是以 # 开头的表名,只在创建它的会话中可见。
当创建它的会话结束时,该表会自动删除。其他会话无法访问这个表。

  • 示例创建局部临时表:
CREATE TABLE #TempTable (ID INT,Name VARCHAR(50)
);

2.2、全局临时表(Global Temporary Table)

全局临时表是以 ## 开头的表名,可以在创建它的服务器实例上的任何会话中可见。
当所有引用该表的会话结束时,该表会自动删除。

  • 示例创建全局临时表:
CREATE TABLE ##TempTable (ID INT,Name VARCHAR(50)
);

使用临时表时,可以像操作任何其他表一样进行数据插入、更新、删除和查询。

值得注意的是,临时表的结构(包括列定义和约束)与永久表类似,可以创建索引、触发器等对象。
然而,当会话结束后,临时表和与之相关的对象都会被自动清理和删除。

临时表对于临时性数据存储和处理非常有用,例如在复杂的查询和存储过程中暂存中间结果或存储需要跨多个查询或操作之间共享的临时数据。

三、游标

在 SQL Server 中,游标(Cursor)是一种用于遍历结果集的数据库对象。
它提供了一种逐行处理查询结果的机制,可以在需要逐行操作数据的情况下使用。

  • 以下是使用游标的一般步骤:

3.1、声明游标

使用 DECLARE CURSOR 语句声明游标,并指定游标的名称和要遍历的查询。

DECLARE CursorName CURSOR FORSELECT Column1, Column2FROM TableName;

3.2、打开游标

使用 OPEN 语句打开游标,准备开始遍历结果集。

OPEN CursorName;

3.3、获取数据

使用 FETCH NEXT 语句获取当前游标位置的一行数据,并将其存储到变量中。可以使用 INTO 子句将数据存储到多个变量中。

FETCH NEXT FROM CursorName INTO @Variable1, @Variable2;

3.4、处理数据

在循环中对获取的行数据进行处理。这可以是对数据进行计算、更新、删除等操作,或者仅仅是输出数据。

WHILE @@FETCH_STATUS = 0
BEGIN-- 处理数据-- 例如执行一些操作或输出数据FETCH NEXT FROM CursorName INTO @Variable1, @Variable2;
END;

3.5、关闭和释放游标

使用 CLOSE 关闭游标,将游标的状态置为不可使用,但不删除游标。最后使用 DEALLOCATE 释放游标,并从内存中删除。

CLOSE CursorName;
DEALLOCATE CursorName;

注意事项:

  • 使用游标时要考虑性能和资源占用,因为游标可能导致性能下降,并占用大量内存。
  • 在处理完成后,务必关闭和释放游标,以释放资源。
  • 可以使用 @@FETCH_STATUS 系统变量来判断是否还有更多行可供遍历。

游标的使用需要谨慎考虑,只在必要的情况下使用,尽量使用集合操作来替代游标,以提高性能。

四、解决方案

根据上面了解到的临时表和游标,结合需求,可以做如下逻辑操作,得到目标查询结果

  • 代码如下
-- 创建局部临时表
if object_id('tempdb..#myTempTable') is not null begindrop table #myTempTable
end
/*else begincreate table #myTempTable(工作中心 varchar(50),序号 int)
end*/-- 临时表不存在情况下
select * into #myTempTable from(select '1001' 工作中心,1 序号 union allselect '1002' 工作中心,2 序号 union allselect '001' 工作中心,3 序号 union allselect '1004' 工作中心,4 序号 union allselect '1008' 工作中心,5 序号 union allselect '001' 工作中心,6 序号 union allselect '001' 工作中心,7 序号 union allselect '001' 工作中心,8 序号 union allselect '1009' 工作中心,9 序号
) a-- select * from #myTempTable-- 定义变狼
declare @工作中心 varchar(50)
declare @序号 int
declare @前一个工作中心 varchar(50)
declare @前一个序号 int
set @前一个工作中心='#'-- 定义游标
declare cursorName cursor for
select 工作中心,序号 from #myTempTable-- 打开游标
open cursorName-- 遍历游标
fetch next from cursorName into @工作中心,@序号;
while @@fetch_status=0 begin-- print(@工作中心)if @前一个工作中心='#' beginset @前一个工作中心=@工作中心set @前一个序号=@序号endelse beginif @工作中心='001' beginif @前一个工作中心!='001' begin-- 输出001上的一条记录print(@前一个工作中心+','+convert(varchar(50),@前一个序号))endendelse beginif @前一个工作中心!=@工作中心 and @前一个工作中心='001' begin-- 输出001最后一条print(@前一个工作中心+','+convert(varchar(50),@前一个序号))endendset @前一个工作中心=@工作中心set @前一个序号=@序号end-- 遍历下一条,一定要加上这句,否则会一直循环fetch next from cursorName into @工作中心,@序号;
end-- 关闭和销毁游标
close cursorName
deallocate cursorName
  • 效果如下在这里插入图片描述

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

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

相关文章

为什么曲面函数的偏导数可以表示其曲面的法向量?

为什么曲面函数的偏导数可以表示其曲面的法向量? 引用资料: 1.知乎shinbade:曲面的三个偏导数为什么能表示法向量? 2.Geogebra羅驥韡 (Pegasus Roe):偏導數、切平面、梯度 曲面 F ( x , y , z ) 0 F(x,y,z)0 F(x,y,…

vim,emacs,verilog-mode这几个到底是啥关系?

vim:不多说了被各类coder誉为地表最强最好用的编辑器;gvim,gui vim的意思; emacs:也是一个编辑器,类似vscode; vim在使用的时候为了增强其功能,有好多好多插件,都是以.…

爬虫 — Scrapy 框架(一)

目录 一、介绍1、同步与异步2、阻塞与非阻塞 二、工作流程三、项目结构1、安装2、项目文件夹2.1、方式一2.2、方式二 3、创建项目4、项目文件组成4.1、piders/__ init __.py4.2、spiders/demo.py4.3、__ init __.py4.4、items.py4.5、middlewares.py4.6、pipelines.py4.7、sett…

Vue的进阶使用--模板语法应用

目录 前言 一. Vue的基础语法 1.插值 1.1文本插值 1.2HTML插值 1.3属性插值 1.4Vue演示三元条件运算 2 指令 2.1if&&else指令(v-if/v-else-if/v-else) 2.2 v-for 指令 2.3 v-on指令(动态参数) 2.4知识点补充之v-if与v-show的区别 3.过…

Webpack设置代码映射,可调试打包后的代码

当我们的代码打包过后再看源码就会变成下面这个样子: 这时候我们就调试不了我们的代码 解决方式: 在webpack.config.js中添加如下代码: module.exports {mode: "development", // 设置打包的模式:production生产模式…

看阿里测试工程师如何玩转postman+newman+jenkins接口自动化

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试) postman用来做接口测试非常方便,接口较多时,则可以实现接口自动化 一、环境准备…

gin框架再探

Gin框架介绍及使用 | 李文周的博客 (liwenzhou.com) lesson03_gin框架初识_哔哩哔哩_bilibili 1.路由引擎 //路由引擎 rgin.Default() 2.一些http请求方法 get post put delete等等 遇到什么路径,执行什么函数 r.GET("/hello",func{做你想做的事返回…

iPhone15线下购买,苹果零售店前门店排长队

今年的苹果新品发布会于北京时间 9 月 13 日凌晨举行,并于 9 月 15 日(周五)开启订购,9 月 22 日(周五)起正式发售。 据多位网友反馈,首批苹果 iPhone15 系列手机、Apple Watch Ultra 2 / Seri…

助力智能医疗检测计数,基于yolov5开发构建支气管肺泡灌洗液细胞检测识别计数系统

与细胞检测识别相关的项目在之前的文章中也有不少的实践,感兴趣的话可以自行移步阅读即可。 《服务医学,基于目标检测模型实现细胞检测识别》 《基于轻量级ShuffleNetv2YOLOv5的DIC-C2DH-HeLa细胞检测识别分析系统》 《基于YOLOv5开发构建荧光染色条件…

版本控制系统git:一文了解git,以及它在生活中的应用,网站维护git代码,图导,自动化部署代码

目录 1.Git是什么 2.git在生活中的应用 2.1git自动化部署代码 3.网站维护git代码 3.1如何在Git代码托管平台等上创建一个仓库 3.2相关文章 4.ruby实现基础git 4.1.Git add 4.2 Git commit 4.3 Git log 1.Git是什么 Git是一个版本控制系统,它可以追踪文件的…

SmartCode ViewerX VNC 3.11 Crack

SmartCode ViewerX VNC 查看器 ActiveX 轻松地将 VNC 查看器功能添加到您的应用程序中 SmartCode ViewerX VNC Viewer ActiveX 使开发人员可以使用一组直观的 ActiveX 属性和方法完全访问 VNC 查看器功能。借助ViewerX控件,开发人员可以轻松地为其应用程序提供屏幕共…

阿里云服务器u1和经济型e实例有什么区别?

阿里云服务器经济型e实例和云服务器u1有什么区别?同CPU内存配置下云服务器u1性能更强,u1实例价格也要更贵一些。经济型e实例属于共享型云服务器,不同实例vCPU会争抢物理CPU资源,并导致高负载时计算性能波动不稳定,而云…

线性表应用(非递减合并、分解链表、删除线性表)

将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间&#xff0c;不另外占用其它的存储空间。表中允许有重复的数据。 #include<iostream> using namespace std; typedef struct list {int data;list* next; }list,*linklist;…

【李沐深度学习笔记】线性代数

课程地址和说明 线性代数p1 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 线性代数 标量 标量&#xff08;scalar&#xff09;&#xff0c;亦称“无向量”。有些物理量&#xff0c;只具有数值大小&#xff0c…

华为云云耀云服务器L实例评测|2核2G跑mysql性能测试

前言 上一次我们介绍了华为云云耀云服务器L实例的基本信息&#xff0c;从购买到特色都做了简要介绍。但是 很多人看到这个配置又产生了迟疑&#xff0c;主要是因为云耀现在提供的全系是2核&#xff0c;性能吃得消吗&#xff1f;今天我们就来做一个性能测试 环境准备 因为我们…

2023华为杯数学建模研赛思路分享——最全版本A题深度解析

问题回顾&#xff1a; WLAN网络信道接入机制建模 1. 背景 无线局域网&#xff08;WLAN, wireless local area network&#xff09;也即Wi-Fi广泛使用&#xff0c;提供低成本、高吞吐和便利的无线通信服务。基本服务集&#xff08;BSS, basic service set&#xff09;是WLAN的…

C++标准模板库——vector的使用及其模拟实现

目录 一. vector的介绍 1.vector的介绍 二.vector的使用 vector中常见接口的介绍vector的构造和析构函数vector的三种遍历方式 三.vector的模拟实现 vector的增删查改vector容器的容量变化和大小增减vector迭代器失效问题vector的小框架 构造函数和析构函数迭代器和operat…

有什么推荐使用的企业上网行为管理软件?

在当今信息化社会&#xff0c;企业的上网行为管理越来越重要。企业上网行为软件是一种能够监控和管理企业员工上网行为的工具&#xff0c;它可以帮助企业更好地管理网络资源&#xff0c;提高工作效率&#xff0c;保护企业信息安全&#xff0c;并符合相关的法律法规。本文将深入…

尝试访问启动磁盘设置时出错怎么办?

当出现“尝试访问启动磁盘设置时出错”这样的错误提示&#xff0c;而且启动转换控制面板打不开了时&#xff0c;是无法开启触摸板功能的。我们可以使用以下方法来解决问题。 1. 在Windows桌面左下角搜索框输入“计算机管理”后点击“打开”。 2. 点击“本地用户与组”&#xff…

[论文阅读]A ConvNet for the 2020s

摘要 视觉识别的咆哮的20年代开始于ViTs的引入&#xff0c;它很快取代了卷积神经网络&#xff0c;成为最先进的图像分类模型。另一方面&#xff0c;一个原始的ViT在用于一般的比如目标识别和语义分割的计算机视觉任务的时候面临困难。层次Transformer(例如&#xff0c;Swin-Tr…