【Sql Server】存储过程的创建和使用事务,常见运用场景,以及目前现状

news2024/11/16 0:51:41

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

在这里插入图片描述

目录

  • 前言
  • 创建存储过程
    • 创建格式
    • 返回数据集
    • 使用事务
    • 修改存储过程
    • 输出异常信息
    • 正确代码
  • 常见场景
  • 目前现状
  • 文章推荐

前言

上周有个小伙伴留言,让博主写一篇存储过程的知识点文章,
刚好趁此机会简单总结下存储过程,以及它的运用场景和现状。
存储过程可以写的很简答,也可以写的很复杂,看实际业务场景。

创建存储过程

创建格式

CREATE PROCEDURE procedure_name
    @parameter1 data_type1 = default_value1,
    @parameter2 data_type2 = default_value2,
    ...
AS
BEGIN
    -- 存储过程的逻辑代码
END

存储过程的主要结构包含以下几个部分:
1.存储过程名称(procedure_name)
用于标识存储过程的唯一名称。

2.输入参数(@parameter1, @parameter2, …)
可选的输入参数,用于接收外部传入的值。每个参数包括参数名、数据类型和默认值(可选)。

3.存储过程逻辑
在 BEGIN 和 END 之间编写存储过程的实际逻辑代码,可以包括各种 SQL 查询、更新、插入、删除等操作。

返回数据集

创建一个存储过程,用于返回一个查询数据集,基于之前文章创建过的表进行查询,具体可以在文章底部跳转链接查询。
这里的存储过程关键词procedure,可以缩写成proc。使用execute关键词执行创建好的存储过程以及传参

-- 创建存储过程
create proc my_query_proc
    @agent_name nvarchar(50)
as
begin
    select * from test_name where agent_name=@agent_name
end

-- 执行存储过程
declare @agent_name3 nvarchar(50)
set @agent_name3='''张三'''
execute my_query_proc @agent_name3

在这里插入图片描述

使用事务

通过传递值,在存储过程中执行操作,添加记录并且使用事务功能,事务关键词transaction,同样可以进行简写为tran。
下面存储过程代码,直接给自增id赋值是会报错,从而导致事务回滚。

-- 使用事务
create proc my_tran_proc
    @agent_name5 nvarchar(50)
as
begin
    begin transaction; -- 开始事务
    
    begin try
        insert into test_name(id,city_name,area_name,agent_name)
        values(1,'深圳市','龙岗区',@agent_name5)
    end try
    begin catch
        rollback transaction; -- 回滚事务
    end catch

    select * from test_name where agent_name=@agent_name5
end

-- 执行存储过程
declare @agent_name6 nvarchar(50)
set @agent_name6='''张三'''
execute my_tran_proc @agent_name6

在上面语句存在了报错情况,但是没有输出异常信息,如果添加成功,那么是会返回两条记录
在这里插入图片描述

修改存储过程

修改存储过程也很简答,通过可视化界面直接找到,在里面修改
在这里插入图片描述
在这里插入图片描述

输出异常信息

通过上一步修改存储过程后,再执行存储过程,切换到消息即可查看到输出的错误信息在这里插入图片描述

正确代码

-- 使用事务
alter proc my_tran_proc
    @agent_name5 nvarchar(50)
as
begin
    begin transaction; -- 开始事务
    
    begin try
        insert into test_name(city_name,area_name,agent_name)
        values('深圳市','龙岗区',@agent_name5)
    end try
    begin catch
        rollback transaction; -- 回滚事务
        declare @errorMessage nvarchar(4000) = error_message();
        print(@errorMessage)
    end catch

    select * from test_name where agent_name=@agent_name5
end

-- 执行存储过程
declare @agent_name6 nvarchar(50)
set @agent_name6='''张三'''
execute my_tran_proc @agent_name6

在这里插入图片描述

常见场景

SQL Server 存储过程的运用场景很多,

主要可分为以下几类:
1.执行复杂的数据处理操作
当需要进行复杂的数据处理时,可能需要多次查询、更新、插入、删除等操作。将这些操作封装在一个存储过程中可以简化代码的编写,提高效率,并且可以重复使用相同的代码逻辑。

2.提高数据库性能
存储过程可以被预编译,并且可以缓存执行计划,这样可以降低数据库服务器的负载并提高查询的执行效率。

3.简化应用程序代码
通过调用存储过程,应用程序可以将逻辑转移至数据库端,简化代码,提高效率,并且可以更容易地对数据库进行管理和维护。

4.加强数据安全性
存储过程可以设置权限控制,限制对数据库的访问权限,确保敏感数据的安全性,防止非法的操作。

5.实现事务操作
对于需要实现事务的数据库操作,可以使用存储过程来组织多个操作,确保事务的原子性。

总之,SQL Server 存储过程是一种强大而灵活的工具,可以用于解决各种不同的数据库需求,提高应用程序的效率和安全性。

目前现状

现在越来越多的公司在实际应用中减少了对存储过程的大量使用。博主在接触到的公司也确实是如此,也看实际业务情况。

这种趋势的主要原因包括:
1.ORM(对象关系映射)框架的普及和成熟
ORM框架(如Entity Framework、Hibernate等)的发展使得应用程序更倾向于采用对象关系映射的方式来处理数据操作,而不是直接使用存储过程。ORM框架可以将数据库表映射为对象,简化了数据访问层的开发和维护。

2.API 和微服务架构的兴起
随着微服务架构的流行,越来越多的公司将业务逻辑封装在独立的 API 中,而不是通过存储过程来实现。API 提供了更灵活的方式来访问和处理数据,同时也更易于扩展和维护。

3.更多的业务逻辑移到应用层
随着业务需求的不断变化,很多公司倾向于将更多的业务逻辑放在应用层实现,而不是存储过程中。这样可以更容易地控制和修改业务逻辑,也减少了对数据库的依赖。

尽管如此,存储过程仍然在某些特定场景下发挥着重要作用,比如处理复杂的数据逻辑、实现事务控制、提高数据库性能等。
因此,并不是所有的公司都完全弃用存储过程,而是根据具体的需求和情况决定是否使用存储过程。

文章推荐

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

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

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

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

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

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

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

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

相关文章

【3GPP】【核心网】【5G】5G核心网协议解析(二)(超详细)

5G UE 附着过程 UE AMF ----------------- 注册请求(Registration Request) ----------------------> <--------------- 鉴权请求(Authentication Request) ------…

Kafka面经

1.Kafka如何保证消息不丢失 生产者&#xff1a; 1.Producer 默认是异步发送消息&#xff0c;这种情况下要确保消息发送成功&#xff0c;有两个方法 a. 把异步发送改成同步发送&#xff0c;这样 producer 就能实时知道消息发送的结果。 b. 添加异步回调函数来监听消息发送的结…

el-select下拉框选项分多列展示

前言 相信很多开发者在实际项目开发过程中都会使用到 element-ui 组件库中的 Select 选择器&#xff0c;这个选择器官方是默认只用一列去展示所有的选项信息&#xff0c;当我们需要展示的选项内容比较多时用户只能通过滚动条去查找&#xff0c;多少会影响操作效率&#xff0c;本…

redis02 安装

官网下载 传送门https://redis.io/download/#redis-downloads 安装Redis mac m1安装 下载你需要版本的软件包放到指定的目录下进行解压 cd 到解压好的redis目录 运行下面的命令进行编译测试 sudo make test 中途可能会提示你安装make工具&#xff0c;按提示安装即可&…

企业如何选择值得信赖的低代码技术平台?

在数字化浪潮的推动下&#xff0c;企业正加速向数字化转型迈进。为了快速适应市场变化并提升竞争力&#xff0c;越来越多的企业开始关注低代码技术平台。然而&#xff0c;面对市场上众多的低代码平台&#xff0c;企业该如何选择值得信赖的合作伙伴呢&#xff1f; 一、高度的可…

(学习日记)2024.03.05:UCOSIII第七节:SysTick+任务时间片

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

【外汇天眼】外汇投资策略:区间突破交易系统

RangeBreak系统介绍 RangeBreak区间突破交易系统被市场广泛用于日内交易&#xff0c;曾经连续多年在《美国期货杂志》盈利交易系统排行榜中位居前十。 目前该交易系统也仍旧被很多专业机构和个人投资者所推崇。 交易者可根据自己的交易习惯和性格特点进行改进&#xff0c;并不…

Jmeter 命令启动 —— 动态参数化!

Jmeter命令行参数 1、在Linux中&#xff0c;使用非GUI的方式执行Jmeter。若需更改参数&#xff0c;必须先编辑jmx文件&#xff0c;找到对应变量进行修改&#xff0c;比较麻烦。 因此&#xff0c;可以参数化一些常用的变量&#xff0c;直接在Jmeter命令行进行设置 2、参数 -J…

根据核磁共振推出的分子结构式

核磁共振仪器实验报告 实验项目名称&#xff1a; 根据核磁共振推出 的分子结构式 实验目的 了解核磁共振的基本原理掌握核磁共振波谱仪的使用方法学习利用核磁共振测定化合物的结构式实验设备 核磁共振波谱仪&#xff08;Bruker 500&#xff09; 主要规格及技术指标&#x…

【数据结构】实现队列

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解队列&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 队列的概念及结构二. 队列的实现队列的结构体初始化销毁队尾插入队头删除显示第一个节点的值…

盘点Java爬虫框架

盘点Java爬虫框架 Java 爬虫框架提供了许多功能丰富的工具和库&#xff0c;用于从网页抓取数据、解析HTML、处理HTTP请求等任务。以下是一些常用的 Java 爬虫框架&#xff1a; 1. **Jsoup**&#xff1a; - Jsoup 是一个用于解析HTML的Java库&#xff0c;它提供了简洁的API&am…

python自学3

第一节第六章 数据的列表 列表也是支持嵌套的 列表的下标索引 反向也可以 嵌套也可以 列表的常用操作 什么是列表的方法 学习到的第一个方法&#xff0c;index&#xff0c;查询元素在列表中的下标索引值 index查询方法 修改表功能的方法 插入方法 追加元素 单个元素追加 多…

C语言-两数组元素互换

#include <stdio.h> #include <string.h>//两数组元素互换 void swap(int ch1[],int ch2[],int sz) {int i 0;char ch 0;for(i 0;i < sz;i){ch ch1[i];ch1[i] ch2[i];ch2[i] ch;} } //打印数组元素 void print(int ch[],int sz) {int i 0;for(i 0;i <…

Git分布式管理-头歌实验日志和版本回退

在Git使用过程中&#xff0c;一种很常见的情况是&#xff1a;发现某个已经提交到仓库里的代码文件有致命的bug&#xff0c;必须将代码回滚到上一个版本&#xff0c;在这种情况下就显示出了Git的强大。Git为每次提交&#xff0c;都保留了日志&#xff0c;根据提交日志&#xff0…

前端开发中,并发请求工具的实现<多文件上传,数据切片>

前端开发中涉及到并发的业务中&#xff0c;如何优雅的实现一个并发工具 1.涉及并发的业务场景 1.> 多文件上传&#xff0c;支持过程中的进度展示&#xff0c;暂停&#xff0c;删除业务 2.> 多数据源的无参静态数据分片获取&#xff0c;如地图业务中海量静态点位的获取分…

centos7升级openssl_3

1、查看当前openssl版本 openssl version #一般都是1.几的版本2、下载openssl_3的包 wget --no-check-certificate https://www.openssl.org/source/old/3.0/openssl-3.0.3.tar.gz#解压 tar zxf openssl-3.0.3.tar.gz#进入指定的目录 cd openssl-3.0.33、编译安装遇到问题缺…

激活函数Swish(ICLR 2018)

paper&#xff1a;Searching for Activation Functions 背景 深度网络中激活函数的选择对训练和任务表现有显著的影响。目前&#xff0c;最成功和最广泛使用的激活函数是校正线性单元&#xff08;ReLU&#xff09;。虽然各种手工设计的ReLU替代方案被提出&#xff0c;但由于在…

机器学习入门-小白必看

机器学习 1. 机器学习的基本概念与背景2. 机器学习的常用方法3.是否需要学习机器学习&#xff0c;机器学习已经过时了&#xff1f;&#xff1f;4. 如何在机器学习上进行创新&#xff1f;5. 我该用哪种机器学习方法&#xff0c;如何定下来呢&#xff1f;总结&#xff08;对小白的…

gazebo平衡车模拟

gazebo和Ros中的平衡车模拟&#xff08;Noetic&#xff09; 控制原理 使用说明 在URDF模型中使用gazebo的 imu 插件获取平衡车姿态从 /joint_state 话题消息获取两轮的速度&#xff0c;相当于电机编码器速度环和直立环使用 串级PID 控制&#xff0c;框图如下&#xff1a;转向环…

02.变量

02.变量 01.变量 变量的概念&#xff1a; 1.变量的作用&#xff1a; 计算机中的存储空间&#xff0c;用于保存数据 2.定义变量的格式 变量名 值 注意&#xff1a; 是赋值运算符&#xff0c;左右两边打上空格是为了代码的规范性&#xff0c;美观性。 num1 3 #num1就是…