【Sql Server】通过Sql语句批量处理数据,使用变量且遍历数据进行逻辑处理

欢迎来到《小5讲堂》,大家好,我是全栈小5。
这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解,
特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。
温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!

在这里插入图片描述

目录

  • 前言
  • 创建表
  • 模拟数据
  • 分组查询
  • while实现
  • 游标实现
    • 输出编号
    • 结合临时表
  • 知识点
    • 游标(Cursor):
    • 临时表(Temporary Table):
  • 文章推荐

前言

最近在进行历史数据处理,刚开始是想着通过在后端写个逻辑处理,也非常简单。
对于数据库而言,通过sql语句处理就是最好的,方便下次再处理时有个sql语句参考,
或者也方便运维人员直接使用,后端代码逻辑处理运维人员并不一定都懂。
因此,本篇文章将模拟批量数据进行sql语句遍历处理。

创建表

创建一张学生城市表,主要字段如下

-- 创建学生城市表
create table student_table
(
    id int identity(1,1),
    name_value nvarchar(50),
    city_value nvarchar(50),
    city_value_temp nvarchar(50),
    create_time datetime default getdate()
)

模拟数据

模拟添加10条记录数据,且设置几条重复记录

-- 模拟10条记录
insert into student_table(name_value,city_value) values
('张三','广州'),
('张三','广州'),
('张三','广州'),
('李四','深圳'),
('李四','深圳'),
('王五','佛山'),
('刘六','佛山'),
('刘六','佛山'),
('张七','东莞'),
('吴八','惠州')

在这里插入图片描述

分组查询

按学生和城市分组查询,且having筛选有重复记录的数据

-- 学生和城市分组查询 - 有重复记录的数据
select name_value,city_value,count(1) repeatcount,max(id) maxid
from student_table 
group by name_value,city_value having count(1)>1

在这里插入图片描述

while实现

进行两次while遍历,然后将学生重复的城市值,除了编号最大那条记录外,其他重复记录则加序号值并赋值到city_value_temp字段里
在这里插入图片描述
1)定义变量表 - 保存重复的学生记录
2)定量变量
3)将源表中的数据插入到表变量中
4)第一层遍历
5)第一层,每次都获取第一条记录
6)定义变量表 - 保存当前学生重复记录
7)第二层遍历
8)第二层,每次都获取第一条记录
9)将当前第二层遍历记录移除
10)更新表字段
11)将当前第一层遍历记录移除


-- =====遍历处理重复数据 - 编写处理逻辑=====
-- 定义变量表 - 保存重复的学生记录
declare @temp_one_table table
(
    name_value nvarchar(50),
    city_value nvarchar(50),
    repeatcount int,
    maxid int
)

-- 定量变量
declare @maxid int
declare @name_value varchar(50)
declare @city_value varchar(50)

-- 将源表中的数据插入到表变量中
insert into @temp_one_table(name_value,city_value,repeatcount,maxid)
select name_value,city_value,count(1) repeatcount,max(id) maxid
from student_table 
group by name_value,city_value having count(1)>1

-- 第一层遍历
while exists(select city_value from @temp_one_table) begin
    
    -- 每次都获取第一条记录
    select top 1 @maxid=maxid,@name_value=name_value,@city_value=city_value from @temp_one_table
    --print(@name_value)

    -- 定义变量表 - 保存当前学生重复记录
    declare @temp_two_table table
    (
        id int,
        name_value nvarchar(50),
        city_value nvarchar(50),
        create_time datetime
    )
    insert into @temp_two_table(id,name_value,city_value,create_time)
    select id,name_value,city_value,create_time from student_table 
    where name_value=@name_value and city_value=@city_value

    -- 第二层遍历
    declare @id int
    while exists(select id from @temp_two_table) begin
                -- 第二层,每次都获取第一条记录
        select top 1 @id=id from @temp_two_table
        print(@name_value+convert(varchar,@id))
        -- 将当前第二层遍历记录移除
        delete from @temp_two_table where id=@id
        -- 更新表字段
        if @id!=@maxid begin
            update student_table set city_value_temp=(@city_value+convert(varchar,@id)) where id=@id
        end
    end

    -- 将当前第一层遍历记录移除
    delete from @temp_one_table where name_value=@name_value and city_value=@city_value
end
select * from student_table
-- =====/遍历处理重复数据 - 编写处理逻辑=====

游标实现

输出编号

下面举例通过游标遍历,逐行输出编号值
在这里插入图片描述

-- 定义变量
declare @id int

-- 定义游标并赋值
declare cursor_name cursor for
select id from student_table

-- 打开游标
open cursor_name

-- 逐行获取数据
fetch next from cursor_name into @id
while @@fetch_status=0 begin
    
    print(@id)
    -- 下一条记录
    fetch next from cursor_name into @id
end

结合临时表

在这里插入图片描述
1)定义变量
2)定义游标并赋值
3)打开游标
4)逐行获取数据
5)创建局部临时表
6)第二层遍历
7)将当前第二层遍历记录移除
8)更新表字段
9)下一条记录
10)关闭游标
11)释放游标


-- 定义变量
declare @name_value nvarchar(50)
declare @city_value nvarchar(50)
declare @repeatcount int
declare @maxid int


-- 定义游标并赋值
declare cursor_name cursor for
select name_value,city_value,count(1) repeatcount,max(id) maxid
from student_table 
group by name_value,city_value having count(1)>1

-- 打开游标
open cursor_name

-- 逐行获取数据
fetch next from cursor_name into @name_value,@city_value,@repeatcount,@maxid
while @@fetch_status=0 begin
    
    --print(@name_value)

    -- 创建局部临时表并赋值
    drop table #temp_table
    create table #temp_table
    (
        id int,
        name_value nvarchar(50),
        city_value nvarchar(50),
        create_time datetime
    )
    insert into #temp_table(id,name_value,city_value,create_time)
    select id,name_value,city_value,create_time from student_table 
    where name_value=@name_value and city_value=@city_value

    -- 第二层遍历
    declare @id int
    while exists(select id from #temp_table) begin
        select top 1 @id=id from #temp_table
        print(@name_value+convert(varchar,@id))
        -- 将当前第二层遍历记录移除
        delete from #temp_table where id=@id
        -- 更新表字段
        if @id!=@maxid begin
            update student_table set city_value_temp=(@city_value+convert(varchar,@id)),remark='游标加临时表处理' where id=@id
        end
    end

    -- 下一条记录
    fetch next from cursor_name into @name_value,@city_value,@repeatcount,@maxid
end

 -- 关闭游标
close cursor_name
-- 释放游标
deallocate cursor_name
select * from student_table

知识点

在 SQL Server 中,游标和临时表都是用于处理数据的工具,但它们的使用方式和目的略有不同。

游标(Cursor):

游标是一种用于逐行处理数据的数据库对象。通常在需要逐行访问数据并执行复杂操作时使用。游标可以使用以下步骤创建和操作:

  • 声明游标:定义一个游标并指定查询的结果集。
  • 打开游标:执行查询并将结果集放入游标中。
  • 逐行获取数据:使用 FETCH 语句一次从游标中获取一行数据。
  • 处理数据:对获取的数据进行操作。
  • 关闭游标:处理完数据后关闭游标,释放资源。
    示例:
DECLARE @id INT
DECLARE cursor_name CURSOR FOR
SELECT id FROM table_name

OPEN cursor_name
FETCH NEXT FROM cursor_name INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
    -- Process data
    FETCH NEXT FROM cursor_name INTO @id
END

CLOSE cursor_name
DEALLOCATE cursor_name

临时表(Temporary Table):

临时表是一种临时存储数据的表,它们一般用于在当前会话中临时存储和处理数据。SQL Server 提供了两种类型的临时表:全局临时表和局部临时表。

  • 局部临时表:以 # 开头,在当前会话中可见,在会话结束时自动删除。
  • 全局临时表:以 ## 开头,对所有会话可见,当创建它的会话结束时自动删除。
    示例:
-- 创建局部临时表

CREATE TABLE #temp_table (
    id INT,
    name VARCHAR(50)
)

-- 插入数据

INSERT INTO #temp_table VALUES (1, 'Alice'), (2, 'Bob')

-- 查询数据

SELECT * FROM #temp_table

-- 删除临时表(在会话结束时会自动删除)

DROP TABLE #temp_table

游标用于逐行处理数据,适用于复杂逐行操作;而临时表用于临时存储和处理数据,适用于需要临时保存中间结果的情况。
在实际应用中,要根据具体需求选择合适的工具来处理数据。

文章推荐

【Sql Server】通过Sql语句批量处理数据,使用变量且遍历数据进行逻辑处理

【新星计划回顾】第六篇学习计划-通过自定义函数和存储过程模拟MD5数据

【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点

【Sql Server】Update中的From语句,以及常见更新操作方式

【Sql server】假设有三个字段a,b,c 以a和b分组,如何查询a和b唯一,但是c不同的记录

【Sql Server】新手一分钟看懂在已有表基础上修改字段默认值和数据类型

总结:温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024Vue高频面试题

前言: Vue 在前端开发领域拥有强劲的发展势头,以下是一些 Vue 的发展趋势: 1.持续增长的用户数量: Vue 作为一款轻量级、易学易用的前端框架,吸引了越来越多的开发者和企业选择使用。其活跃的社区和丰富的资源也促进了用户数量的不断增长。 2.生态系统不断丰富: 随着 V…

第七节:Vben Admin权限-后端获取路由和菜单

系列文章目录 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权限-前端控制方式 第六节:Vben Admin权限-后端控制方式 第七节…

【启动npm run serve 奇怪的报错】

报错如下: INFO Starting development server... utils.js:587Uncaught TypeError [ERR_INVALID_ARG_VALUE]: The argument path must be a string or Uint8Array without null bytes. Received E:\\#\u0000#idea-workspace\\wonderful-search\\wonderful-search-v…

【JAVA】JAVA方法的学习和创造

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​💫个人格言:“没有罗马,那就自己创造罗马~” 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不…

影像质感再升级:JOEL FAMULARO Phantom LUTs让作品焕然一新

JOEL FAMULARO Phantom LUTs是一套专业的电影级别的预设,旨在为电影制作人和视频编辑人员提供高质量的颜色校正和调整工具。它为用户提供了一系列精心设计的色彩预设,旨在帮助摄影师在电影、电视和照片后期制作中快速实现专业且一致的色彩风格。这些预设…

自动化测试工具:提升软件质量的利器

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

网络编程套接字——实现简单的UDP网络程序

目录 1、预备知识 1.1、认识端口号 1.2、端口号 vs 进程pid 1.3、认识TCP协议 1.4、认识UDP协议 1.5、网络字节序 2、socket编程接口 2.1、socket常见API 2.2、sockaddr结构 3、实现一个简易的UDP服务器和客户端通信 log.hpp UdpServer.hpp UdpClient.cc Main.cc…

【Maven入门篇】(2)IDEA集成Maven环境的具体操作

🎊专栏【Maven入门篇】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【The truth that you leave】 🥰欢迎并且感谢大家指出我的问题 文章目录 🍔配置Maven环境⭐方法一(当前工程&…

EPICS和Arduino Uno之间基于串行文本协议的控制开发

Arduino Uno的串口服务程序设置如文本的串口通信协议设计以及在Arduino上的应用-CSDN博客中所示。通过在串口上发送约定的文本协议,它实现的功能如下: 实现功能: 读取三路0.0V~5.0V模拟量输入,读取端口A0~A2设置三路0.0V~5.0V的模…

光伏电站信息化管理系统如何优化能源管理

随着可再生能源的快速发展,光伏电站作为其中的重要组成部分,其运营管理面临着越来越多的挑战。为了提升光伏电站的能源管理效率,信息化管理系统成为了不可或缺的工具,那么如何优化能源管理呢? 1.数据实时监控 信息化管…

一站式解决方案:uni-app条件编译及多环境配置,appid动态修改攻略!

前言 这篇文章主要介绍uniapp在Hbuilderx 中,通过工程化,区分不同环境、动态修改小程序appid以及自定义条件编译,解决代码发布和运行时手动切换到问题。 背景 在企业级的应用中,通常会分为,开发、联调、生产等多个环…

GPT-1, GPT-2, GPT-3, InstructGPT / ChatGPT and GPT-4 总结

1. GPT-1 What the problem GPT-1 solve? 在 GPT-1 之前,NLP 通常是一种监督模型。 对于每个任务,都有一些标记数据,然后根据这些标记数据开发监督模型。 这种方法存在几个问题:首先,需要标记数据。 但 NLP 不像 CV&…

从嵌套事务的日志看MyBatis的sqlSession生命周期

service层业务代码 Override public void test(){QueryWrapper<StoreRebateCalculateLog> queryWrapper;queryWrapper new QueryWrapper<>();queryWrapper.eq("delete_flag", 0);//执行查询A,A事务开启List<StoreRebateCalculateLog> storeRebat…

区块链推广海外市场怎么做,CloudNEO服务商免费为您定制个性化营销方案

随着区块链技术的不断发展和应用场景的扩大&#xff0c;区块链项目希望能够进入海外市场并取得成功已成为越来越多公司的目标之一。然而&#xff0c;要在海外市场推广区块链项目&#xff0c;需要采取有效的营销策略和措施。作为您的区块链项目营销服务商&#xff0c;CloudNEO将…

深度学习——SAM(Segment-Anything)代码详解

目录 引言代码目录segment-anything 代码详解build_sam.pypredictor.pyautomatic_mask_generator.py 引言 从去年年初至今&#xff0c;SAM(Segment Anything )已经问世快一年了&#xff0c;SAM凭借其强大而突出的泛化性能在各项任务上取得了优异的表现&#xff0c;广大的研究者…

详解MySql索引

目录 一 、概念 二、使用场景 三、索引使用 四、索引存在问题 五、命中索引问题 六、索引执行原理 一 、概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。暂时可以理解成C语言的指针,文章后面详解 二、使用场景 数据量较大&#xff0c;且…

【图像分割】使用Otsu 算法及迭代计算最佳全局阈值估计并实现图像分割(代码实现与分析)

本实验要求理解全局阈值分割的概念&#xff0c;并实现文本图像分割。需要大家深入理解Ostu 算法的实现过程及其迭代原理&#xff0c;同时通过学习使用Otsu 算法及其迭代&#xff0c;实践图像分割技术在文本图像处理中的应用。 以下将从实验原理、实验实现、实验结果分析三部分对…

老阳视频号带货项目,究竟是一个怎样的选择呢?

近年来&#xff0c;随着网络技术的飞速发展&#xff0c;直播带货已经成为电商行业的新宠。其中&#xff0c;网红老阳以其独特的风格和专业度&#xff0c;成功吸引了大量粉丝的关注&#xff0c;并带动了一波视频号带货的热潮。那么&#xff0c;现在跟随老阳的步伐&#xff0c;投…

sqllab第二十七A关通关笔记

知识点&#xff1a; 双引号闭合union select 大小写绕过 Union Select这里不能进行错误注入&#xff0c;无回显 经过测试发现这是一个双引号闭合 构造payload:id1"%09and%091"1 页面成功回显 构造payload:id0"%09uNion%09SElect%091,2,3%09"1 页面成功…

AI论文速读 | TPLLM:基于预训练语言模型的交通预测框架

论文标题&#xff1a;TPLLM: A Traffic Prediction Framework Based on Pretrained Large Language Models 作者&#xff1a;Yilong Ren&#xff08;任毅龙&#xff09;, Yue Chen, Shuai Liu, Boyue Wang&#xff08;王博岳&#xff09;,Haiyang Yu&#xff08;于海洋&#x…