SQL server 创建存储过程

news2024/11/25 16:49:53

SQL Server如何创建存储过程

  存储过程: 可以理解为完成特定功能的一组 SQL 语句集,存储在数据库中,经过第一次编译,之后的运行不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来调用存储过程。

如何创建存储过程

  创建存储过程可以有两种方式:一是在 SSMS 中界面操作创建存储过程,而后修改其中的 SQL 语句及存储过程名称;二是通过命令行直接编写创建存储过程。
  在操作之前,得要有一个数据库和数据库中将要使用存储过程查询或操作的数据表,这里以 MyDBDemo 数据库为例,其中有一个 sys_user 的用户数据表。
在这里插入图片描述
  1、SSMS 界面创建存储过程:
  界面鼠标操作创建存储过程方便快捷,一些基础的脚本不需要手动编写,由 SSMS 自动生成。
  步骤: 展开数据库中的【可编程性】,在【存储过程】上鼠标单击右键出现弹出菜单,点击【存储过程】即可弹出新的查询窗口,里面有一些默认的 SQL 脚本。
在这里插入图片描述
  软件自动生成的存储过程创建脚本,现在可以基于此修改存储过程中的内容了。
在这里插入图片描述
  说明: 从 第 1 行到 20 行不需要关注,这些都是一些设置和注释说明,第 21 行到 33 行才是存储过程的主要内容。下面将通过代码逐行介绍这些命令。

CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName> -- 这一行表示存储过程的名称, '<>' 是占位符,将其替换为存储过程的名称
	-- 以下列出存储过程的参数以及返回参数,这是设置存储过程有哪些参数和返回什么数据
	<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, 
	<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN -- 从这里开始就是存储过程的主体部分
	-- 这里面的内容就是 SQL 语句集,可以放置许多的 SQL 增删查改等操作脚本
END -- 这里结束存储过程,表示存储过程的 SQL 集在这里结束

  2、SQL 脚本创建存储过程:
  脚本创建存储过程就是自行编写基础的创建存储过程的语句,如上所示代码中的内容都是自行手动编写,然后执行脚本即可创建好这个存储过程。
  如下创建存储过程的脚本,是传入用户的数据参数,插入到数据库中,而后再查询出来展示,详细讲解请看注释,SQL 脚本如下所示:

CREATE PROCEDURE InsertUser -- 这里存储过程的名称为‘InsertUser’
	-- 输入参数有userno、pwd、username、role、email,输出参数有 count
	-- 输入输出参数的名称前面必须加上 ‘@’ ,表示其是一个变量。
	@userno nvarchar(50), --输入参数,用户编码
	@pwd nvarchar(50), -- 输入参数,登录密码
	@username nvarchar(50), -- 输入参数,用户姓名
	@email nvarchar(50), -- 输入参数,用户邮箱
	@count int output-- 输出参数,当前数据表中的总数据条数,这里输出参数采用 ‘output’ 标识
AS
BEGIN -- 从这里开始就是存储过程的主体部分
	-- 这里插入一条数据到数据表中,数据内容来源于存储过程中传入的内容,其中用户角色字段 ‘[role]’ 设置默认值为 ‘admin’
	INSERT INTO [dbo].[sys_user] ([userno],[pwd],[username],[role],[email])
     VALUES (@userno,@pwd,@username,'admin',@email);
	 -- 查询出数据表
	 select * from [dbo].[sys_user];
	 -- 返回值总条数查询
	 select @count = @@ROWCOUNT;
END -- 这里结束存储过程,表示存储过程的 SQL 集在这里结束

存储过程的使用或调用

  存储过程的使用需要采用关键字 EXEC 加上存储过程名称,而后跟随参数的方式。

DECLARE @pdCount INT; -- 定义返回值参数
-- 通过 exec <存储过程名称> <参数列表> 调用存储过程
exec [dbo].[InsertUser] @userno='user-1',@pwd='123',@username='wanger',@email='123@abccom',@count=@pdCount output
select @pdCount as '数据表总数' -- 查询出返回值中的内容

  执行结果如下所示:
在这里插入图片描述

存储过程的意义

  优点:
  1、存储过程加快系统运行速度,存储过程只在创建时编译,以后每次执行时不需要重新编译。
  2、存储过程可以封装复杂的数据库操作,简化操作流程,例如对多个表的更新,删除等。
  3、可实现模块化的程序设计,存储过程可以多次调用,提供统一的数据库访问接口,改进应用程序的可维护性。
  4、存储过程可以增加代码的安全性,对于用户不能直接操作存储过程中引用的对象,SQL Server可以设定用户对指定存储过程的执行权限。
  5、存储过程可以降低网络流量,存储过程代码直接存储于数据库中,在客户端与服务器的通信过程中,不会产生大量的T_SQL代码流量。
  缺点:
  1、数据库移植不方便,存储过程依赖与数据库管理系统, SQL Server 存储过程中封装的操作代码不能直接移植到其他的数据库管理系统中。
  2、不支持面向对象的设计,无法采用面向对象的方式将逻辑业务进行封装,甚至形成通用的可支持服务的业务逻辑框架。
  3、代码可读性差,不易维护。不支持集群。

结语

  为什么需要存储过程:效率高、降低网络流量、复用性高、可维护性高、安全性高。

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

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

相关文章

spring源码解析——IOC之自定义标签解析

概述 之前我们已经介绍了spring中默认标签的解析&#xff0c;解析来我们将分析自定义标签的解析&#xff0c;我们先回顾下自定义标签解析所使用的方法&#xff0c;如下图所示&#xff1a; 我们看到自定义标签的解析是通过BeanDefinitionParserDelegate.parseCustomElement(ele…

Neo4j-双向关系

概述 这是GraphAware中关于双向关系的解释。 网址链接Modelling Data in Neo4j: Bidirectional Relationships | GraphAware 定向关系 Neo4j中的关系必须有一个语义化的类型和方向。 没有方向关系是模棱两可的&#xff0c;上面A队打败B队&#xff0c;如果没有方向&#xff0c…

PTE深度了解(一)

目录 PTE模板开始大审查吗&#xff1f;我的模板还能用吗&#xff1f; 使用模版&#xff0c;不会额外扣你分 类型一&#xff08;前20秒说模版&#xff09; 类型二&#xff08;老实巴交&#xff09; 类型三&#xff08;就是都说简单句&#xff09; 1.查重复 2.增加内容分识…

算法经济:数据驱动的新智能世界

随着计算机技术和信息科学的发展&#xff0c;以及云计算、大数据、区块链、人工智能等先进技术的融合&#xff0c;一场关于“数据”的革命正在全球范围内蓬勃展开。这种现象被称为“算法经济”&#xff0c;它是以数据为驱动、算法为核心的新的经济形态。 首先&#xff0c;我们需…

代码随想录day49:动态规划part10

121.买卖股票的最佳时机 贪心&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int low INT_MAX;int result 0;for (int i 0; i < prices.size(); i) {low min(low, prices[i]); // 取最左最小价格result max(result, prices[i…

Java抽象类、接口

1.抽象类 1.abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类那么该类就是抽象类。2.抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类3.抽象类,不能使用new关键字来创建对象,它是用来让子类继承的4.抽象方法,只有…

supervisor守护python进程报FATAL错 spawn error

出现问题 我们在使用supervisor守护使用虚拟python环境的时候可能会碰到如下的报错内容。 touchFish FATAL Exited too quickly (process log may have details)当我们使用sudo supervisorctl status查看这个进程的状态的时候&#xff0c;有可能还会返回包含一个spawn er…

小程序中如何导出会员卡的档案信息

对于医院、美容院等特殊商家&#xff0c;可能需要在给会员添加一些档案。例如今天客户是什么情况&#xff0c;做了什么服务&#xff0c;解决了什么问题。添加这些档案后&#xff0c;系统会保存这些信息&#xff0c;供下次来的时候使用&#xff0c;或者为商家日后做营销提供依据…

基于Java+SpringBoot+Vue+Element的OA系统的设计和实现

基于JavaSpringBootVueElement的OA系统的设计和实现 源码传送入口前言主要技术系统设计功能截图数据库设计代码论文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的…

Python3 如何实现 websocket 服务?

Python 实现 websocket 服务很简单&#xff0c;有很多的三方包可以用&#xff0c;我从网上大概找到三种常用的包&#xff1a;websocket、websockets、Flask-Sockets。 但这些包很多都“年久失修”&#xff0c; 比如 websocket 在 2010 年就不维护了。 而 Flask-Sockets 也在 2…

Linux文件出现“M-oM-;M-?” ^M 等情况

1、当在编辑linux系统的文件时&#xff0c;会出现如下情况&#xff1a; 解决方法&#xff1a;单个文件可以使用vim 进行修改&#xff0c;shift :&#xff0c; 然后 set nobomb 2、当文件出现每一行末尾^M的情况&#xff1a; 解决方法&#xff1a;使用vi的替换功能。启动vi&am…

LabVIEW风力涡轮机的雷电流测量系统中集成高速摄像机

LabVIEW风力涡轮机的雷电流测量系统中集成高速摄像机 随着全球风电装机容量的快速增长&#xff0c;雷电活动对风力发电机组造成的损害受到更多关注&#xff0c;特别是在雷电活动强烈的地区。在冬季闪电期间&#xff0c;风力涡轮机等高层结构会受到向上的雷击。众所周知&#x…

215 数组中的第K个最大元素

满足时间复杂度o(n)的方法&#xff1a; 快排的思想 class Solution{ public:int findKthLargest(vector<int>& nums,int k){return quickSelect(nums,k);} private:int quickSelect(vector<int>& nums,int k){//随机选择基数int privotnums[rand()%nums…

#循循渐进学51单片机#IIC总线与EEPROM#not.13

1、彻底理解I2C的通信时序&#xff0c;不仅仅是记住。 前几章我们学了一种通信协议叫做 UART 异步串行通信&#xff0c;这节课我们要来学习第二种常用的通信协议 I 2 C 。 I 2 C 总线是由 PHILIPS 公司开发的两线式串行总线&#xff0c;多用于连接微处理器及其外围芯片。…

Java-day17(反射)

Reflection(反射) 动态语言的关键 允许程序在执行期借助于Reflection API取得任何类的内部信息&#xff0c;并能直接操作任意对象的内部属性及方法提供的功能: 在运行时判断任意一个对象所属类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在…

Vue3 动态组件 component:is= 失效

错误代码 用Vue3&#xff0c;组件无需注册&#xff0c;所以就会提示“注册了不不使用”的报错&#xff0c; 于是用了异步注册&#xff0c;甚至直接为了不报错就在下面使用3个组件&#xff0c;有异步加载&#xff0c;但还是实现不了预期效果 <script setup> import { re…

#define定义标识符详解

0.预定义符号 在讲解#define之前先给大家介绍几个预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI C&#xff08;标准C&#xff09;&#xff…

服务器感染了Locked勒索病毒后的正确处理步骤,勒索病毒解密

在服务器中感染了Locked勒索病毒后&#xff0c;应该采取以下一系列步骤来应对和清除病毒&#xff1a; 立即断开网络连接&#xff1a;防止病毒进一步传播感染。备份重要数据&#xff1a;在执行任何操作之前&#xff0c;一定要先备份服务器上的重要数据。这样可以防止在处理病毒过…

经典网络解析(四) ResNet | 残差模块,网络结构代码实现全解析

文章目录 1 设计初衷2.网络结构2.1 残差块2.2 中间的卷积网络特征提取块1 两层33卷积层2 先11卷积层&#xff0c;再33卷积层&#xff0c;再33卷积层 2.3 结构总览表格 3 为什么残差模块有效&#xff1f;3.1 前向传播3.2 反向传播3.3 恒等映射3.4 集成模型 4.代码实现 1 设计初衷…

如何学习嵌入式Linux?

今日话题&#xff0c;如何学习嵌入式Linux&#xff1f;嵌入式底层开发是一种重要的技术&#xff0c;它被广泛应用于各种嵌入式系统中。随着科技的不断发展&#xff0c;嵌入式系统已经成为了我们日常生活中不可或缺的一部分。这就使得嵌入式开发的重要性也凸显出来。刚好我这有一…