【数据库】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.过…

基础练习 十进制转十六进制

问题描述 十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是…

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

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

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

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

人工智能未来可期:超越人类能力的新科技

随着科技的飞速发展,人工智能(AI)已经逐渐成为我们生活、工作不可或缺的一部分。从智能语音助手到自动驾驶汽车,再到医疗诊断和金融投资,AI的应用越来越广泛。本文将探讨人工智能未来的发展趋势,以及可能超…

LeetCode99之恢复二叉搜索树(相关话题:中序遍历)

目录 题目描述 解题思路 递归写法 非递归写法 思路拓展 难点剖析

在 Vue 项目中添加字典翻译工具

背景 当我们在编写前端代码时,往往会对状态类的字段感到苦恼,因为他可能是0,1,2…,也可能是…,我们将他称之为:“字典(dict)”。它是多变的,而且后期可能会有…

gin框架再探

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

vue 如何加载组件

一&#xff0c;如何加载组件 第一步 引用组件 import MyComponent from ./components/MyComponent.vue; 第二部注入组件 export default{//注入组件components:{MyComponent}} 三 显示组件 <template><!-- 显示组件 --><MyComponent /> </template> 二…

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

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

软件测试还能不能做

大家好&#xff0c;我是洋子&#xff0c;最近接了些紧急项目&#xff0c;好久没更文了&#xff0c;趁着公众号粉丝也已经突破1.1w了&#xff0c;发一篇随笔 偶然间&#xff0c;在测试交流群看到群友在转发了一个视频&#xff0c;视频的内容是某教开发的培训机构在劝退做软件测…

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

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

2022年贵州省职业院校技能大赛(高职组)“软件测试”赛项竞赛规程

2022年贵州省职业院校技能大赛&#xff08;高职组&#xff09; “软件测试”赛项竞赛规程 一、赛项名称 赛项名称&#xff1a;软件测试 赛项组别&#xff1a;高职组 赛项归属产业&#xff1a;电子信息 二、竞赛目的 &#xff08;一&#xff09;检验教学成效 本赛项竞赛…

版本控制系统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是一个版本控制系统&#xff0c;它可以追踪文件的…

SmartCode ViewerX VNC 3.11 Crack

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

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

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

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

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