SQL Server数据库基础知识——数据库存储过程怎么写

article/2025/10/22 10:32:55

SQL Server数据库基础知识

存储过程概述

  • 什么是存储过程?

  • 存储过程的种类

  • 如何创建、修改、删除、调用存储过程?

  • 存储过程的优缺点

  • 存储过程和触发器的区别?

  • 存储过程和函数的区别?

  • 存储过程的使用

1. 什么是存储过程?

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个“execute 存储过程名 参数”命令来调用存储过程。

2. 存储过程的种类

1 系统存储过程

以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。

2 自定义存储过程(本地存储过程)

以cp_开头,是用户为了完成某一特定功能而创建的存储过程,一般所说的存储过程就是指本地存储过程。

3 临时存储过程

分为两种存储过程:

一是本地临时存储过程,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;

二是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。

4 远程存储过程

在SQL Server2005中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。

5 扩展存储过程

扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。

3. 如何创建、修改、删除、调用存储过程?

–创建存储过程
create proc 存储过程名字
as
语句

–修改存储过程
alter proc 存储过程名字
as
语句

–卸载存储过程
drop proc 存储过程名字

–调用存储过程
exec 存储过程名称

4. 存储过程的优缺点

优点:

1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

3.存储过程可以重复使用,可减少数据库开发人员的工作量(复用性高,面向对象的编程思想)

4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权

缺点:

​ 1:调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。

​ 2:移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。

​ 3:重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过 程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。

​ 4: 如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变 化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。

5. 存储过程和触发器的区别?

触发器与存储过程的主要区别在于触发器的运行方式。存储过程必须有用户、应用程序或者触发器来显示的调用并执行,而触发器是当特定时间出现的时候,自动执行或者激活的,与连接用数据库中的用户、或者应用程序无关。

6. 存储过程和函数的区别?

存储过程是用户定义的一系列SQL语句的集合,而函数通常是数据库已定义的方法,具体区别如下:

1.对于存储过程来说可以返回参数,而函数只能返回值或者表对象.

2.函数必须有返回值,存储过程可有可无

3.存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一部分来调用

7. 存储过程的使用

接下来以两张表来向大家演示存储过程的使用。

书籍分类表(BookTypes)和书籍表(books)结构设计

img

img

书籍分类表(BookTypes)
IDName(分类名称)Nums(数量)
1科技类10
2文学类10
3军事类10
书籍表(books)
IDName(书籍名称)Remark(备注)TypeID(分类ID)
1数据库NULL1
2西游记NULL2
3百团大战NULL3
4数据库NULL1
5数据库NULL1
6数据库NULL1
7数据库NULL1
1:不带参数的存储过程
--创建存储过程查询数据
create proc cp_select_book_bybook --创建一个叫cp_select_book_bybook的存储过程
as --要执行的操作select * from books --从books表中查询数据
--调用存储过程
exec cp_select_book_bybook
2:带输入参数的存储过程
--根据名称参数查询数据
create proc cp_select_book_ByName
(
@name varchar(50)
)
asselect*from books where name like '%'+@name+'%'
--调用
exec cp_select_book_ByName'数据库'
3:带输出参数的存储过程
--根据名称查询,返回记录,同时返回记录数
go
create proc cp_select_book_ByNameExt
(
@name varchar(50),
@recordRows int out  --out表示输出类型
)
asselect*from books where name like '%'+@name+'%'select @recordRows=count(*) from books--调用--定义一个变量,接收返回参数@recordRows的值declare @rs int --定义一个变量接收@recordRows的数据exec cp_select_book_ByNameExt'数据库',@rs outprint '查询到的记录数是:'+convert(varchar(50),@rs)
4:简单的分页的存储过程的创建和调用
--根据名称,页码,每页显示的条数  --输入参数
--返回查询条件的总记录数  --输出参数
--显示查询结果go
create proc cp_page
(
@name varchar(50),
@pageIndex int,  --页码
@pageSize int,  --每页显示条数
@rs int out  --总记录数,out表示输出类型
)
asselect top (@pageSize)*from bookswhere id not in(select top (@pageSize*(@pageIndex-1)) id from books where name like '%'+@name+'%'order by id)and name like '%'+@name+'%' order by idselect @rs= count(*) from books where name like '%'+@name+'%'--调用--定义一个变量,接收返回参数@totalcount的值declare @rows int --定义一个变量接收@totalcount的数据exec cp_page'数据库',1,5,@rows outprint '查询到的总记录数是:'+convert(varchar(50),@rows)

http://chatgpt.dhexx.cn/article/BbMiLynV.shtml

相关文章

GaussDB数据库存储过程介绍

文章目录 一、前言二、GaussDB中的定义三、存储过程的使用场景四、存储过程的使用优缺点五、存储过程的示例及示例解析1、GaussDB存储过程语法格式2、GaussDB存储过程语法示例3、存储过程的调用方法 七、总结 一、前言 华为云数据库GaussDB是一款高性能、高安全性的云原生数据…

查看当前数据库存储引擎

一:查看当前数据库支持的存储引擎 show ENGINES; 二:查看指定数据库所有表使用的存储引擎 使用 show table status from dbname;命令,可以查看指定数据库所有表使用的存储引擎,其中“dbname”为数据库名。 show table status from 库名; 三…

数据库储存Excel表信息

目录 目标 实验背景 原理 具体实现 目标 以Java程序为中介,将Excel表中的信息储存到Mysql数据库中 实验背景 先需要将一张包含学生和老师信息的Excel表中的数据存储到Mysql数据库中 原理 先通过相关jar包的类从Excel表中读取到信息,接着对这些信息…

数据库之存储

无论是什么数据库,其本质还是以数据的形式存储在计算机的物理介质上的,所以,我们先来看看什么是物理存储介质。 物理存储介质:高速缓冲存储器->主存储器->快闪存储器->磁盘->光盘->磁带,从左到右性能由高到低,价格…

数据库存储介绍

数据存储在存储设备中,在实际应用中,有多种存储设备,下面我们一一介绍。同时在保存数据时,有特定的组织方式,在下面我也做简单介绍。 一 存储设备介绍 1.1 高速缓存 Cache,计算机拥有1M或跟多的高速…

Excel|给某一列添加同一个字

如图所示给新型冠状病毒肺炎数据中“武汉”这一列都加上“市”字: 先在D列打两行:“武汉市”、“孝感市” 然后在D3按CtrlE,即可全部填充 ps:如果删除某列同一个字的话用替换即可

鼠标单击就选中一个字的解决办法

有时候我们想在两个字中间插入一个字,点击鼠标时却总是选中一个字。 解决办法: 按一下键盘的Insert键就好了。 造成这种情况的原因:极大可能是因为我们删除文字时不小心碰到了Insert键。 看完如果对你有帮助,感谢点赞支持&…

什么是字节

** 什么是字节 ** 位(bit):是计算机 内部数据 存储的最小单位 11001100是一个八位数的二进制数。 字节(byte ):是计算机中 数据处理的基本单位,习惯上用大写B来表示; 1B(byte,字节…

关于“一个字等于多少字节?“的问题解答

网上有人说这个问法不严谨,我觉得严格说确实是这样,但是我个人觉得不能这样说! 举个例子,这个问题就好比你上初中的时候那些证明题很多其实是很不严谨的,但是限于知识体系,到高中你会发现好像不是那么一回…

键盘打字时,打一个字后面少一个字如何解决

键盘敲字时,如果光标在中间,输入一个字后面就少一个字 文字输入的例子 只需要按INS键就可以恢复正常了 注:如果是手提笔记本电脑,一个键盘有两下两行,先按一下FN按键,再按INS即可切换为正常状态了

“一个字等于多少个字节?”是一个不严谨的问法

“一个字等于多少个字节?”是一个不严谨的问法 直接回答一个字等于多少个字节,也是不严谨的答法。 相关概念: 1、位(bit) 来自英文bit,音译为“比特”,表示二进制位。位是计算机内部数据储存的最小单位。…

parted分区命令行形式

一、pared分区实例 1、第一个主分区3G parted -s /dev/sdc mklabel gpt (标签为gpt,小于2t用msdos) parted -s /dev/sdc mkpart primary 0 3G 2、剩余空间给扩展分区 parted -s /dev/sdc mkpart entended 3 100% (从3G开始后面都做扩展分区)…

centos通过parted对2T以上硬盘分区并对根目录进行扩容

GPT的分区表很好了解决了传统MBR无法逾越2TB的限制。但是在Linux系统中,传统的fdisk命令无法支持gpt分区方式,这时候我们就要用到parted命令 需求: 将一个4t的硬盘(sdb)分为3个区,并将sdb1挂载在根目录下进行扩容 1…

Linux Command parted 创建分区

Linux Command parted 创建分区 tags: lvm 文章目录 Linux Command parted 创建分区1. 简介2. 交互模式2.1 常见命令2.2 查看分区表2.3 修改成 GPT 分区表2.4 建立分区2.5 建立文件系统2.6 调整分区大小2.7 删除分区 3. 命令行模式 1. 简介 虽然我们可以使用 fdisk命令对硬…

parted分区详解

---------- Linux中有两种常用的分区表MBR分区表(主引导记录分区表)和GPT分区表(GUID分区表),其中: MBR分区表:支持的最大分区时2TB,最多支持4个主分区,或3个主分区和1个拓展分区。 GPT分区表:支持最大18…

parted磁盘分区 教程

Linux parted磁盘分区实现步骤解析 相对于fdisk,parted用的比较少,主要用于大于2T的分区。 1.开始分区 help是查看帮助信息。 2.查看磁盘信息 可以看到当前磁盘没有分区,需要将分区表(Partition Table)类型更改为g…

【Windows环境下使用fvm管理多版本Flutter(flutter版本升级回退)】

Windows环境下使用fvm管理多版本Flutter(flutter版本升级回退) 安装FVM升级版本升级后,使用方法二再次安装fvm 安装FVM 方式一: 使用choco安装fvm(当时环境中Flutter版本是1.22.4,Dart是2.10.4&#xff0…

一个很好用的Flutter SDK版本管理神器fvm

前言 目前Flutter SDK正式版本已经更新到2.2.了,当升级了最新版运行之前的项目,其中最大的变化应该是要适配空安全了,这时如果项目又比较紧急暂不做适配,又只能降级Flutter版本了,然后新项目又要在最新Flutter版本去开…

在MacOS上不用FVM的Flutter多版本管理

网上看到都是用fvm进行多版本管理。 我用的方式没那么复杂,非常简单。 从下面url下载各版本的Flutter: https://flutter.dev/docs/development/tools/sdk/releases?tabmacos 按常规方式配置Flutter的环境。 将下载的Flutter包解压成文件夹后,都放到…

从FVM上线前的测试网统计报告中看前景,Filecoin将会迎来什么变化?

FEVM将在2023/03/14主网上线! 在Calibration网络升级正式完成后,Filecoin V18 Hygge升级将于2023年3月14日(π日)正式上线!此次升级将正式为Filecoin网络带来智能合约。基于FVM的可编程性。此次更新升级将释放数据经济…