SQL Server存储过程和触发器的使用

存储过程

(1)创建存储过程,使用Employees表中的员工人数来初始化一个局部变量,并调用这个存储过程。

1.	Create PROCEDURE test @number1 int output --输出参数,可以从程序中返回信息  
2.	As  
3.	begin  
4.	    Declare @number2 int  
5.	    Set @number2=(Select COUNT(*) from Employees)  
6.	    Set @number1=@number2  
7.	end

运行结果如下

执行该存储过程,并查看结果。

Declare @num int  
EXEC test @num output  
Select @num  

运行结果如下

(2)创建存储过程,比较两个员工的实际收入,若前者比后者高就输出0,否则输出1。

1.	Create PROCEDURE compa @id1 char(6),@id2 char(6),@bj int output  
2.	as  
3.	Begin  
4.	    Declare @sr1 float, @sr2 float  
5.	    Select @sr1=income-outcome from salary Where EmployeeID=@id1  
6.	    Select @sr2=income-outcome from salary Where EmployeeID=@id2  
7.	    If @sr1>@sr2  
8.	        Set @bj=0  
9.	    Else  
10.	        Set @bj=1  
11.	end  
12.	GO 

运行结果如下

(3)创建添加职员记录的存储过程EmployeeAdd。

Create PROCEDURE EmployeeAdd   
(  
@employeeid char(6),@name char(10),@education char(4), @birthday datetime,  
@workyear tinyint,@sex bit,@address char(40), @phonenumber char(12),  
@departmentID char(3))  
As  
Begin  
Insert into employees   
values(@employeeid,@name,@education,@birthday,@workyear,  
@sex,@address,@phonenumber,@departmentID)  
end  
return

运行结果如下

(4)创建带output游标参数的存储过程,在employees中声明并打开一个游标。

Create PROCEDURE em_cursor @em_cursor cursor VARYING output  
As  
Begin  Set @em_curcor=CURSOR forward_only static  FOR  Select * from Employees  open @em_cursor  
end  

运行结果如下

声明一个局部游标变量,执行上述存储过程,并将游标赋值给局部游标变量,然后通过该游标变量读取记录

Declare @mycursor cursor  
EXEC em_cursor @em_cursor=@mycursor output  
Fetch next from @mycursor  
While(@@FETCH_STATUS=0)  
begin  fetch next from @mycursor  
end  
close @mycursor  
deallocate @mycursor 

运行结果如下

(5)创建存储过程,使用游标确定一个员工的实际收入是否排在前三名。结果为1表示是,结果为0表示否。

Create PROCEDURE top_three @em_id char(6),@ok bit output  
As  
Begin  Declare @x_em_id char(6)  Declare @act_in int,@seq int  Declare salary_ids cursor for  Select EmployeeID,Income-Outcome from salary  order by income-outcome desc  Set @seq=0  Set @ok=0  open salary_ids  fetch salary_ids into @x_em_id,@act_in  While @seq<3 and @ok=0  begin  Set @seq=@seq+1  if @x_em_id=@em_id  Set @ok=1  fetch salary_ids into @x_em_id,@act_in  end  close salary_ids  deallocate salary_ids  
end 

运行结果如下

执行该存储过程

Declare @ok bit  
EXEC top_three '108991',@ok output  
Select @ok 

运行结果如下

要求一个员工的工作年份大于6时将其转移到经理办公室工作

1.	Select * from dbo.Departments  
2.	Select * from dbo.Employees  
3.	Select * from dbo.Salary   
4.	  
5.	Create PROCEDURE que1 @id char(6)  
6.	as  
7.	Begin  
8.	    Declare @workyear char(6),@dep_id char(3)  
9.	    Select @workyear=workyear from Employees Where EmployeeID=@id  
10.	    Select @dep_id=Departments.departmentID from employees,departments  
11.	        Where employees.DepartmentID=departments.DepartmentID   
12.	        and departmentName='经理办公室'   
13.	    If @workyear>6  
14.	        Update Employees Set departmentID=@dep_id Where EmployeeID=@id  
15.	end 

根据每个员工的学历将收入提高500

1.	Create Procedure que2 @id char(6)  
2.	As  
3.	Begin  
4.	    Declare @education char(6)  
5.	    Select @education=Education from Employees Where EmployeeID=@id  
6.	    Update salary Set Income=income+500 Where EmployeeID=@id  
7.	end 

使用游标计算本科及以上学历的员工在员工总数中占的比例

1.	Declare @edu varchar(10),@part_count int,@all_count int  
2.	Declare mycursor cursor   
3.	for Select distinct education,count(education) over(partition by education)as part_count,  
4.	count(education) over() as all_count from Employees  
5.	open mycursor  
6.	fetch next from mycursor into @edu,@part_count,@all_count  
7.	While @@FETCH_STATUS=0  
8.	Begin  
9.	    print @edu+'占总人数比例:'+convert(varchar(100),convert(numeric(38,2),@part_count/1.0/@all_count*100)+'%'  
10.	    fetch next from mycursor into @edu,@part_count,@all_count  
11.	end  
12.	close mycursor  
13.	deallocate mycorsor  

触发器

对于TGGL数据库,Employees表的DepartmentID列与Departments表的DepartmentID列应满足参照完整性规则。

  1. 向Employees表添加记录时,该记录的DepartmentID字段值在Departments表中应存在。
  2. 修改Departments表的DepartmentID字段值时,该字段在Employees表中的对应值也应修改。
  3. 删除Departments表的记录时,该记录的DepartmentID字段值在Employees表中对应的记录也应删除。

对于上述参照完整性规则,在此通过触发器实现。

(1)向Employees表插入一个记录时,通过触发器检查记录的DepartmentID在Departments中是否存在,不存在则取消插入或修改操作。

1.	Create Trigger employeesIns on dbo.Employees  
2.	    for insert,Update  
3.	    as  
4.	    Begin  
5.	        IF((Select DepartmentID from inserted)not in  
6.	            (Select DepartmentID from Departments))  
7.	            Rollback    
8.	    end 

运行结果如下

(3)删除Departments中记录的同时删除Employees中DepartmentID对应记录.

Create Trigger DepartmentDelete on dbo.Departments  for Delete  as  Begin  Delete from Employees  Where DepartmentID=(Select DepartmentID from deleted)  end 

运行结果如下

(4)创建Instead of触发器,当向salary中插入记录时,先检查EmployeeID列上的值在Employees中是否存在,如果存在则执行插入操作,如果不存在则提示“员工编号不存在”。

1.	Create Trigger EM_EXISTS on salary  
2.	Instead of Insert  
3.	as  
4.	Begin  
5.	    Declare @employeeID char(6)  
6.	    Select @employeeID=EmployeeID from inserted  
7.	    If (@employeeID in (Select EmployeeID from Employees))  
8.	        Insert into salary Select * from inserted  
9.	    Else  
10.	        print '员工编号不存在'  
11.	end

运行结果如下

(5)创建DDL触发器,当删除数据库的一个表时,提示‘不能删除表’,并回滚删除表的操作。

Create Trigger table_delete on Database  
After drop_table  
as  print '不能删除表'  rollback transaction 

运行结果如下

Employees与salary的EmployeeID应满足完整性规则,请用触发器实现两个表之间的参照完整性。

1.	Create Trigger que1_1 on salary  
2.	for insert,update  
3.	as  
4.	Begin  
5.	    If(Select employeeid from inserted)not in  
6.	    (Select EmployeeID from Employees)  
7.	    rollback  
8.	end  
9.	Create trigger que1_2 on Employees  
10.	for update  
11.	as  
12.	Begin  
13.	    Update Salary Set zemployeeID=(Select Employeeid from inserted)  
14.	    Where EmployeeID=(Select employeeid from deleted)  
15.	end  
16.	  
17.	Create Trigger que1_3 on Employees  
18.	for delete  
19.	as  
20.	Begin  
21.	    Delete from salary  
22.	    Where EmployeeID=(Select EmployeeID from deleted)  
23.	End

若将Employees中员工的工作时间增加到1年,则收入增加500,若增加两年则增加1000。

1.	Create Trigger que2_1 on Employees  
2.	After update  
3.	as  
4.	Begin  
5.	    Declare @a int,@b int  
6.	    Set @a=(Select workyear from inserted)  
7.	    Set @b=(Select workyear from deleted)  
8.	    If (@a>@b)  
9.	        update salary  
10.	        Set income=income+(@a-@b)*500  
11.	        Where EmployeeID in (Select EmployeeID from inserted)  
12.	End 

创建UPdate触发器,当salary中income增加500时,outcome增加50。

1.	Create Trigger que3_1 on salary  
2.	for update  
3.	as  
4.	Begin  
5.	    If((Select income from inserted)-(Select income from deleted)=500)  
6.	        Update salary Set outcome=outcome+50  
7.	        Where EmployeeID=(Select EmployeeId from inserted)  
8.	end 

创建instead of触发器,实现向不可更新视图插入数据。

1.	Create VIEW a_view  
2.	as  
3.	Select a.EmployeeID,name,workyear,income,outcome from Employees a,salary b  
4.	Where Employees.employeeID=Salary.EmployeeID  
5.	Create Trigger que4_1 on a_view  
6.	Instead of insert  
7.	as  
8.	Begin  
9.	    Declare @ei char(6),@name char(10),@wy tinyint,@ic float,@oc float  
10.	    Select @ei=EmployeeID,@name=name,@wy=workyear,@ic=income,@oc=outcome  
11.	    from inserted  
12.	    insert into Employees(EmployeeID,name,workyear)values(@ei,@name,@wy)  
13.	    insert into salary values(@ei,@ic,@oc)  
14.	end  

创建DDl触发器,当删除数据库时,提示无法删除,并回滚删除操作。

1.	Create Trigger que5_1 on all server  
2.	after drop_database  
3.	as  
4.	print '不能删除'  
5.	rollback transaction  
6.	drop database Hao  

​​​​​​​

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

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

相关文章

子类是否能继承

继承 父类&#xff1a; 子 类 构造方法 非私有 不能继承 私有&#xff08;private&#xff09;不能继承 成员变量 非私有 能继承 私有&…

2025年【山东省安全员C证】考试题及山东省安全员C证考试内容

在当今建筑行业蓬勃发展的背景下&#xff0c;安全生产已成为企业生存与发展的基石。安全员作为施工现场安全管理的直接责任人&#xff0c;其专业能力和资质认证显得尤为重要。山东省安全员C证作为衡量安全员专业水平的重要标准&#xff0c;不仅关乎个人职业发展&#xff0c;更直…

Spring 中的 bean 生命周期

&#x1f331; 一、什么是 Bean 生命周期&#xff1f; 在 Spring 容器中&#xff0c;一个 Bean 从“创建 → 初始化 → 使用 → 销毁”&#xff0c;经历了完整的生命周期。 Spring 提供了 多个扩展点 让你可以在这些阶段做事情&#xff0c;比如注入资源、日志记录、连接资源、清…

Media streaming mental map

Media streaming is a huge topic with a bunch of scattered technologies, protocols, and formats. You may feel like hearing fragments without seeing the big picture. Let’s build that mental map together — here’s a high-level overview that connects everyt…

AIDD-深度学习 MetDeeCINE 破译代谢调控机制

深度学习 MetDeeCINE 破译代谢调控机制 目录 使用 FEP/REMD 和 DFT 方法准确预测药物多靶点绝对结合自由能的新途径。Scorpio 框架利用对比学习优化核苷酸序列表示&#xff0c;提升基因组分析效率&#xff0c;尤其在未知序列的分类和泛化能力上表现出色。LPM 模型整合多模态扰…

【2】搭建k8s集群系列(二进制)之安装etcd数据库集群

一、etcd服务架构 Etcd 是一个分布式键值存储系统&#xff0c;Kubernetes 使用 Etcd 进行数据存储&#xff0c;所以先 准备一个 Etcd 数据库&#xff0c;为解决 Etcd 单点故障&#xff0c;应采用集群方式部署&#xff0c;这里使用 3 台组建集群&#xff0c;可容忍 1 台机器故障…

fastGPT—前端开发获取api密钥调用机器人对话接口(HTML实现)

官网文档链接&#xff1a;OpenAPI 介绍 | FastGPT 首先按照文档说明创建api密钥 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

cpp自学 day19(多态)

一、基本概念 同一操作作用于不同的对象&#xff0c;产生不同的执行结果 &#x1f449; 就像「按F1键」&#xff1a;在Word弹出帮助文档&#xff0c;在PS弹出画笔设置&#xff0c;​同一个按键触发不同功能 &#xff08;1&#xff09;多态类型 类型实现方式绑定时机​静态多态…

Java 大视界 -- Java 大数据在航天遥测数据分析中的技术突破与应用(177)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

人脸考勤管理一体化系统(人脸识别系统,签到打卡)

人脸考勤管理一体化系统 项目介绍 本项目是基于Flask、SQLAlchemy、face_recognition库的人脸考勤管理一体化系统。 系统通过人脸识别技术实现员工考勤打卡、人脸信息采集、人脸模型训练等功能。 项目采用前后端分离的技术框架&#xff0c;基于Flask轻量级Web框架搭建后端服务…

单调栈学习C++

目录 一&#xff0c;每日温度 二&#xff0c;下一个更大的元素I 三&#xff0c;下一个更大的元素II 四&#xff0c;接雨水 小结&#xff1a; 单调栈是一种特殊的栈结构&#xff0c;里面的元素按照单调递增或者递减的顺序排列。常用于解决元素左边或者右边比它大或者小的问…

网络钓鱼攻击的威胁和执法部门的作用(第一部分)

在当今的数字世界中&#xff0c;网络犯罪分子不断开发新技术来利用个人、企业和政府机构。 最普遍和最具破坏性的网络犯罪形式之一是网络钓鱼——一种社会工程手段&#xff0c;用于欺骗人们提供敏感信息&#xff0c;例如登录凭据、财务数据和个人详细信息。 随着网络钓鱼攻击…

左值与右值,空间与数据

左值是空间&#xff0c;右值是数据 编程总是对“数据”&#xff0c;对"存放数据的空间"操作 a返回一个当前的数据&#xff0c;存放到一个临时空间中&#xff0c;自身的空间中的数据再进行运算 a直接对自身空间中的数据进行运算 其余知识&#xff1a; 1.变量名的意…

无人机飞行术语科普!

一、基础操作类 1. 炸机 指无人机意外坠毁或严重损坏&#xff08;如撞树、撞楼、失控摔机等&#xff09;。 例句&#xff1a;“今天风太大&#xff0c;差点炸机&#xff01;” 2. 一键放生 调侃某些情况下无人机失控飞丢&#xff0c;无法找回&#xff08;源自某些品牌…

模拟算法(一):一维数组模拟

目录 模拟的概念 例1&#xff1a;开关灯 算法思路&#xff1a; 代码如下&#xff1a; 输入输出&#xff1a; 例2&#xff1a;序列操作和查询 算法思路&#xff1a; 代码如下&#xff1a; 输入输出&#xff1a; 例3&#xff1a;数组折叠 算法思路&#xff1a; 代码如…

MySQL 基础入门

写在前面 关于MySQL的下载安装和其图形化软件Navicat的下载安装,网上已经有了很多的教程,这里就不再赘述了,本文主要是介绍了关于MySQL数据库的基础知识。 MySQL数据库 MySQL数据库基础 MySQL数据库概念 MySQL 数据库&#xff1a; 是一个关系型数据库管理系统 。 支持SQL语…

Qt中的多种输出方式,信号与槽的基本使用

完成Hello World可以通过很多控件实现 如采用编辑框来完成hello world 编辑框分为单行编辑框----QLineEdit 和多行编辑框---QTextEdit 采用单行编辑框&#xff0c;创建项目后&#xff0c;展开forms文件夹&#xff0c;双击ui文件进入 qt designer设计页面 找到line edit 拖到页…

英语表达年代和世纪

英语表达年代和世纪 1. Century (世纪)1.1. Start and end of centuries 2. Decade (年代)2.1. Usage 3. 英语表达年代和世纪4. HomeworkReferences XXX0 年代指 XXX0 年 - XXX9 年的连续 10 年&#xff0c;例如 1760 年代指 1760 年至 1769 年这连续 10 年。 XX 世纪 X0 年代…

MySQL数据库管理5

23.事务 1&#xff09;事务&#xff1a;可以认为是做一件事情 需要多个SQL 要么同时成功 要么同时失败 需求&#xff1a;银行转账update 你的账户 把你的钱减少update 你朋友的账户 把他的钱增多​这两个SQL不能只成功一个 要么都成功 要么都失败那么 我们就需要用到事务了 它…

闭包和装饰器

什么是闭包 闭包&#xff08;Closure&#xff09;是 Python 中一个非常重要的概念&#xff0c;它是一种特殊的函数对象&#xff0c;通常用于封装和延迟计算某些值。以下是闭包的详细定义和解释&#xff1a; 1.闭包的定义 闭包是指一个函数对象&#xff0c;它不仅包含函数的代…