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

news2024/11/20 6:27:47

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 FOR
    SELECT Column1, Column2
    FROM 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 begin
    drop table #myTempTable
end
/*else begin
    create table #myTempTable(
        工作中心 varchar(50),
        序号 int
    )
end*/

-- 临时表不存在情况下
select * into #myTempTable from(
    select '1001' 工作中心,1 序号 union all
    select '1002' 工作中心,2 序号 union all
    select '001' 工作中心,3 序号 union all
    select '1004' 工作中心,4 序号 union all
    select '1008' 工作中心,5 序号 union all
    select '001' 工作中心,6 序号 union all
    select '001' 工作中心,7 序号 union all
    select '001' 工作中心,8 序号 union all
    select '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 @前一个工作中心='#' begin
        set @前一个工作中心=@工作中心
        set @前一个序号=@序号
    end
    else begin
        if @工作中心='001' begin
            if @前一个工作中心!='001' begin
                -- 输出001上的一条记录
                print(@前一个工作中心+','+convert(varchar(50),@前一个序号))
            end
        end
        else begin
            if @前一个工作中心!=@工作中心 and @前一个工作中心='001' begin
                -- 输出001最后一条
                print(@前一个工作中心+','+convert(varchar(50),@前一个序号))
            end
        end

        set @前一个工作中心=@工作中心
        set @前一个序号=@序号
    end

    -- 遍历下一条,一定要加上这句,否则会一直循环
    fetch next from cursorName into @工作中心,@序号;
end

-- 关闭和销毁游标
close cursorName
deallocate cursorName
  • 效果如下在这里插入图片描述

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

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

相关文章

计算机网络相关知识点

谈一谈对OSI七层模型和TCP/IP四层模型的理解? 这两种模型都是网络通信中重要的参考模型,他们的设计和功能有一些区别。 首先OSI,OSI七层模型,也被称为开放系统互联参考模型,是一种在国际标准化组织(ISO)中…

网络知识——局域网和交换机

定义: 局域网(Local Area Network,简称LAN)是指在某一区域内由多台计算机互联成的计算机组。广域网(Wide Area Network,简称WAN)是指跨越单个建筑物或大型园区,连接分布在特定地理区…

2023 Sui Builder House全球之旅圆满收官

2023年的最后一场Builder House于上周在新加坡举行,包括主题演讲、小组讨论和研讨会等聚焦Sui的现在和未来的活动。其中,zkLogin是本次活动的最大亮点。作为一种新的Sui原语,zkLogin允许用户使用Web2身份验证创建帐户,有望推动大规…

计算机网络常见问题

1.谈一谈对OSI七层模型和TCP/IP四层模型的理解? 1.1.为什么要分层? 在计算机中网络是个复杂的系统,不同的网络与网络之间由于协议,设备,软件等各种原因在协调和通讯时容易产生各种各样的问题。例如:各物流…

通过 BigQuery 中的 11 个新链增强 Google Cloud 的区块链数据服务

2018 年初,Google Cloud 与社区合作,通过BigQuery 公共数据集实现区块链数据民主化;2019 年,又扩展了六个数据集;今天,我们在 BigQuery 公共数据集中添加了 11 个最受欢迎的区块链预览版。我们也在对该程序…

windbg -I之后如何恢复原有的

直接运行了一下windbg -I,抓取了注册表行为,然后这里记录一下,方便翻阅。 抓取到的windbg的注册表 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger 将值改为 "C:\WINDOWS\system32\vsji…

Linux:进程概念的引入和理解

文章目录 进程的初步理解进程的实质理解查看进程 前面对操作系统有了一个基础的认知,从中得出的最重要的一个思想是,在认识一个新事物前要先描述,再组织,有了这样的思想也可以用于学习进程的概念 进程的初步理解 有了前面的思想…

三维模型3DTile格式轻量化在三维展示效果上的重要性分析

三维模型3DTile格式轻量化在三维展示效果上的重要性分析 三维模型3DTile格式轻量化在三维展示效果上扮演着至关重要的角色。随着计算机图形学和虚拟现实技术的不断发展,我们已经可以创建和渲染非常精细和复杂的三维模型,以实现逼真的视觉效果。然而&…

3D大模型如何轻量化?试试HOOPS Communicator,轻松读取10G超大模型!

随着计算机技术的不断发展,3D模型在各行各业中的应用越来越广泛。然而,随着模型的复杂性和规模不断增加,处理和浏览超大型3D模型变得越来越具有挑战性。本文将探讨如何轻量化3D大模型,以及如何使用HOOPS Communicator来读取和浏览…

IC芯片测试:如何对芯片静态功耗进行测试?

静态功耗也叫静态电流,是指芯片在静止状态下的电流或者是指芯片在不受外界因素影响下自身所消耗的电流。静态功耗对于芯片来说是衡量一款芯片的功耗与效率非常重要的指标。 传统手动测试静态功耗只需在芯片的输入端串上一台万用表,然后对芯片各个端口添加…

C语言 指针 模拟排序函数 指针数组笔试题上

目标&#xff1a;使用【冒泡排序】的算法&#xff0c;模拟一个排序函数&#xff0c;可以排序任意类型的数据 void print_arr(int arr[], int sz)//打印函数 只能接受整型数组 {int i 0;for (i 0; i < sz; i){printf("%d ", arr[i]);}printf("\n"); }…

5.数学公式中-符号加粗

在 LaTeX 中&#xff0c;\boldsymbol 命令用于将数学公式中的符号或字母加粗显示&#xff0c;以突出显示它们或强调它们的重要性。通常&#xff0c;这个命令用于加粗矢量、矩阵、符号等。 要使用 \boldsymbol&#xff0c;您需要在数学模式中&#xff08;例如&#xff0c;在 \[…

C#中的(++)和(--)运算符

目录 背景: 的前加 效果展示:​ 的后加 效果展示 :​ 总结: 背景: 自增和自减运算符存在于C/C/C#/Java等高级语言中&#xff0c;它的作用是在运算结束前(前置自增自减运算符 )或后(后置自增自减运算符 )将 变量的值加(或减)1。 在C#中&#xff0c;和--是自增和自减运…

Pixea Plus for Mac:极简图片浏览,高效图片管理

在处理和浏览图片时&#xff0c;我们往往需要一个得心应手的工具&#xff0c;尤其是当你的图片库包含了各种不同格式&#xff0c;例如JPEG、HEIC、psd、RAW、WEBP、PNG、GIF等等。今天&#xff0c;我们要推荐的&#xff0c;就是一款极简、高效的Mac图片浏览和管理工具——Pixea…

云计算行业人才缺口巨大,给自己一个超车涨薪的机会!

2023年了&#xff0c;云计算已经不是未来趋势&#xff0c;而是我们正处于的环境&#xff01; 你一定用过云笔记、云盘吧&#xff1f;大家其实都在跟“云”打交道&#xff01;我们如今所处的时代中&#xff0c;云计算无疑是当下最热门的技术。 各大中小企业都在纷纷是将自己的…

哈啰两轮一面凉面经

离职原因 对语言的要求 java内存空间 jdk1.7&#xff1a;运行时每个进程有自己独立的一段存储区域。在这片区域里包括了各个线程共享的堆和方法区&#xff0c;还有每个线程独立的程序计数器、本地方法栈和虚拟机栈&#xff08;虚拟机栈由栈帧组成&#xff0c;每个栈帧中包括…

十几张高清世界地图

十几张高清世界地图 仅供学习&#xff01;

指标收集与分析:打造可观测性平台的关键技术【文末送书】

文章目录 写在前面兼容全域信号量所谓全域信号量有哪些&#xff1f;统一采集和上传工具统一的存储后台自由探索和综合使用数据好书推荐 写作末尾 写在前面 随着可观测性理念的深入人心&#xff0c;可观测性平台已经开始进入了落地阶段&#xff0c;它的先进性已经毋庸置疑&…

有哪些好用的上网行为管理软件?(上网行为管理软件功能好的软件推荐)

随着互联网的快速发展&#xff0c;企业的信息化管理和员工的上网行为已经成为企业信息化建设的重要组成部分。上网行为管理软件作为一种新型的管理工具&#xff0c;可以帮助企业实现对员工上网行为的管控和优化&#xff0c;进而提高企业的工作效率和网络安全。本文将对多款市场…

精品Python运动球馆场地预约系统

《[含文档PPT源码等]精品基于Python实现的球馆场地预约系统设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;JavaSc…