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

欢迎来到《小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
beginselect * 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
beginbegin transaction; -- 开始事务begin tryinsert into test_name(id,city_name,area_name,agent_name)values(1,'深圳市','龙岗区',@agent_name5)end trybegin catchrollback transaction; -- 回滚事务end catchselect * 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
beginbegin transaction; -- 开始事务begin tryinsert into test_name(city_name,area_name,agent_name)values('深圳市','龙岗区',@agent_name5)end trybegin catchrollback transaction; -- 回滚事务declare @errorMessage nvarchar(4000) = error_message();print(@errorMessage)end catchselect * 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.mzph.cn/news/721653.shtml

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

相关文章

浅析扩散模型与图像生成【应用篇】(五)——SDEdit

5. SDEdit: Guided Image Synthesis and Editing With Stochastic Differential Equations 该文提出一种基于SDE扩散模型的引导图像生成和编辑方法。通过使用者在原图上给出一些引导,比如在图像上涂鸦或者增加一个图块,甚至可以不给定原图,直…

如何从 WordPress 中的静态资源中删除查询字符串

今天有一个客户来问询,hostease主机创建的WordPress站点,在GTMetrix或Pingdom进行网站速度测试,看到有关查询字符串的警告。如果不想看到查询字符串的警告,要如何处理呢?我们测试,可以通过一些处理满足这个需求。我们…

三整数排序问题的解题逻辑

【题目描述】 输入3个整数,从小到大排序后输出。 【样例输入】 20 7 33 【样例输出】 7 20 33 【解析】 本题解法大概有3种: 1、穷举条件法。 此方法先判断a、b、c大小的所有可能,再根据各种可能性输出不同的排序。 思路是先判断a、…

C++17中的类模板参数推导

在C17之前,必须明确指出类模板的所有参数。自从C17起必须指明类模板参数的限制被放宽了。通过使用类模板参数推导(Class Template Argument Deduction(CTAD)),只要编译器能根据初始值推导出所有模板参数,那么就可以不指明参数。 C17中的类模板…

记录一次排查负载均衡不能创建的排查过程

故障现象,某云上,运维同事在创建负载均衡的时候,发现可以创建资源,但是创建完之后,不显示对应的负载均衡。 创建负载均衡时候,按f12发现console有如下报错 后来请后端网络同事排查日志发现,是后…

中科大计网学习记录笔记(十七):拥塞控制原理 | TCP 拥塞控制

前言: 学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程 该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面的部分发现信…

论文学习—Model-based Adversarial Meta-Reinforcement Learning

Model-based Adversarial Meta-Reinforcement Learning Abstract1. Introduction2. Related work3 Preliminaries基于模型的强化学习(MBRL):区别和联系: 4 Model-based Adversarial Meta-Reinforcement Learning4.1 Formulation 4.2 Computin…

LeetCode 每日一题 Day 88 - 94

2673. 使二叉树所有路径值相等的最小代价 给你一个整数 n 表示一棵 满二叉树 里面节点的数目,节点编号从 1 到 n 。根节点编号为 1 ,树中每个非叶子节点 i 都有两个孩子,分别是左孩子 2 * i 和右孩子 2 * i 1 。 树中每个节点都有一个值&a…

好书推荐丨细说PyTorch深度学习:理论、算法、模型与编程实现

文章目录 写在前面深度学习推荐图书内容简介作者简介 推荐理由粉丝福利写在最后 写在前面 本期博主给大家推荐一本深度学习的全新正版书籍,感兴趣的小伙伴快来看看吧~ 深度学习 深度学习是机器学习的一个分支,它模仿人脑神经网络的工作原理进行复杂的…

蓝桥杯练习系统(算法训练)ALGO-986 藏匿的刺客

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 强大的kAc建立了强大的帝国,但人民深受其学霸及23文化的压迫,于是勇敢的鹏决心反抗。   kAc帝国防…

linux kernel物理内存概述(二)

目录 物理内存数据结构 设备数物理内存描述 物理内存映射 map_kernel map_mem zone数据结构 zone类型 物理内存数据结构 站在处理器角度,管理物理内存的最小单位是页面。使用page数据结构描述,通常默认大小4kB,采用mem_map[]数组来存…

学习java第一天(下载并配置环境+写第一个java程序)

一.安装 1.下载 直接去官网上选择与你电脑符合的版本下载 官网链接Java Archive Downloads - Java SE 8u211 and later (拿我的为例 Windows x64版本) ​ 2.然后安装好exe(要让自己知道在哪) 3.配置环境 大佬链接&#xff1…

“每一次的感应,都是对环境的温柔拥抱。”#STM32项目二 《感应开关盖垃圾桶》【上】

“每一次的感应,都是对环境的温柔拥抱。”#STM32项目二 《感应开关盖垃圾桶》【上】 前言预备知识1.定时器介绍11.1软件延时的优缺点1.2定时器工作原理1.3定时器的分类1.4 STM32F103C8T6定时器资源1.5通用定时器介绍 2.定时器介绍22.1定时器计数模式2.2定时器时钟源…

【VTKExamples::PolyData】第四十六期 Reflection

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例Reflection,并解析接口vtkReflectionFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. Reflection …

Docker容器详解

一、概述 1.1 基本概念: Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚…

SpringCloud 各自组件的停更/升级/替换

一、停更不停用 现在 SpringCloud 不再修复 bug,也不再接收合并请求,也不再发布新版本,但是目前还是可以继续使用的。 二、以前的组件 以前 SpringCloud 常用的组件如下图,服务的注册和发现使用 Eureka,服务的负载和调…

深入理解c指针(七)

目录 十、回调函数和qsort函数 1、回调函数 2、简单介绍size_t 数据类型 3、qsort 排序函数 3.1 qsort函数简单举例1(升序排序) 3.2 qsort函数简单举例2(字符串长度排序) 3.3 简单讲解 -> 操作符 3.4 常见符号的ASCII…

如何利用会话式AI提升你的工作效率?

会话式AI如何改变我们的生活和工作 在当今时代,内容策略的重要性日渐凸显,良好的内容策略能够与流量及转化率紧密相连,成为企业在内容策略领域不容忽视的营销工具之一。 然而,目前内容同质化现象严重,企业若想在内容营…

iPaas数据传输的方式

一、iPaas平台概述 iPaas(Integration Platform as a Service)平台,作为一种先进的云计算服务模式,为开发者和企业提供了一种全面且灵活的应用集成解决方案。它构建在PaaS(Platform as a Service)基础之上…

【C++庖丁解牛】初始化列表 | Static对象 | 友元函数

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1. 再谈构造函数1.1 …