SQLServer 学习笔记之超详细基础SQL语句 Part 7

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: SQLServer 学习笔记之超详细基础SQL语句 Part 7

Sqlserver学习笔记


-----------------------接Part 6-------------------

29存储过程和触发器

存储过程由一组预先编辑好的SQL语句组成。将其放在服务器上。由用户通过指定存储过程的名称来执行

 

触发器是一种特殊类型的存储过程,它不是由用户直接调用的,而是当用户对数据进行操作(包括数据的INSERT ,UPDATE,DELETE操作)时自动执行。

 

29.1创建、执行、删除简单的存储过程。

CREATEPROCEDURE存储过程名

[@parameter data_type][= default][output][,…..]

AS

sql语句

 

29.2执行存储过程

对存储在服务器上的存储过程,可以使用exectue命令或者其名称执行

 

29.3查看存储过程

对用户建立存储过程,可以使用对象资源管理器或系统存储过程查看该存储过程的定义。

1, 使用对象资源管理器查看存储过程,在对象资源管理器窗口中,展开数据库结点,选择相应的数据库,展开可编程性存储过程结点。

2, 使用系统存储过程查看存储过程,可以使用SP_HELPTEXT  SP_DEPENDS SP_HELP

 

29.4删除存储过程

可以利用资源管理器或者drop proc语句将其删除

示例

--存储过程

CREATEPROCEDURE pro

AS

SELECT学生.学号,学生.姓名,班级.班级名称,专业.专业名称,系部.系部名称

FROM学生

JOIN班级ON学生.班级代码=班级.班级代码

JOIN专业ON班级.专业代码=专业.专业代码

JOIN系部ON班级.系部代码=系部.系部代码

--上述语句的执行后,我们可以在[可编程性\存储过程]看到一个名为dbo.pro的存储过程

EXECpro

 

--创建带参数的一个存储过程

CREATEPROC pro1

@sex VARCHAR(10),--注意这里有逗号

@id VARCHAR(10)

AS

SELECT学生.学号,学生.姓名,班级.班级名称,专业.专业名称,系部.系部名称

FROM学生

JOIN班级ON学生.班级代码=班级.班级代码AND学生.性别=@sex

JOIN专业ON班级.专业代码=专业.专业代码

JOIN系部ON班级.系部代码=系部.系部代码AND系部.系部代码=@id

 

--执行存储过程

EXECpro1 '','1'

 

--带输出参数的存储过程

 

CREATEPROC pro2

@setName VARCHAR(10),

@getNum VARCHAR(10)OUTPUT

AS

SELECT@getNum =学号FROM学生WHERE姓名=@setName

 

--执行

----该语句的执行,看不到结果,但是如果用.net等编程语言调用时则会看到效果

EXECpro2 '林姐','1'

 

--查看存储过程

EXECSP_HELPTEXT pro1

 


EXECSP_DEPENDS pro1

 

 

EXECSP_HELPpro1

 

 

 

--删除存储过程

DROPPROC pro1

 

29.5触发器

触发器的优点:

1触发器自动执行,在对表中的数据做了任何修改之后立即被激活

2触发器能够对数据库中的相关表实现级联更改。

 

29.6临时表

INSERTED表和DELETED表用于存放对表中数据行的修改信息。他们是触发器执行时自动创建的。当触发器工作完成,他们也被删除。他们只是只读表,不能向他们写入内容。

 

INSERTED表:用来存储INSERTUPDATE语句所影响的行的副本。

意思就是在INSERTED表中临时保存了被插入或被更新后的记录行。

在执行INSERTUPDATE语句时,新加行被同时添加到INSERTED表和触发器表中

 

DELETED表:用来存储DELETEUPDATE语句所影响的行的副本。

意思是在DELETED表中临时保存了被删除或被更新前的记录行。在执行DELETEUPDATE语句时,行从触发器表中删除,并传到DELETED表中。所以可以从deleted表中检查删除的数据行是否能删除。

所以当表中某条记录的某项值发生变化时,变化前的值已经通过系统自动创建的临时表DELETED表和INSERTED表保存了被删除行或插入的记录行的副本。我么可以从这两个表中查询出变化前的值并赋给变量。

 

29.7使用sql创建触发器

格式:

CREATETRIGGERtrigger_name

ON{TABLE | view}

FOR{[INSERT],[DELETE],[UPDATE]}

AS

sql语句

 

查看触发器信息

EXECsp_helptrigger表名

 

删除触发器

DROP TRIGGER触发器名称

 

示例

USEstudent --在数据库student下的操作。。

GO---这个词不能少

--创建触发器

CREATETRIGGER tri_insert

ONstd_TABLE ---指定目标表

FORINSERT---触发器类型

AS--别忘了这个

DECLARE@a CHAR(20), @name CHAR(20), @major CHAR(20)

--从临时表INSERTED中获取数据,数据保存在定义的变量中

--INSERTED保存着被插入或更新后的数据

SELECT@a =学号,@name =姓名,@major =专业方向FROMINSERTED

--删除时的对应操作,把获取的数据插入另一表中

INSERTINTO std_table2(学号,名称,专业方向)VALUES(@a, @name, @major)

--执行上述语句后,我们可以在触发器 结点下看到一个tri_insert

--测试

SELECT*FROM std_table

--SELECT * FROM std_table2--此时出错,std_table2没有建立

--删除触发器

DROPTRIGGER tri_insert

 

--重新创建

USEstudent --在数据库student下的操作。。

GO---这个词不能少

--上述语句的执行--选定数据库,和试图界面下手动选定一个样

--创建触发器

CREATETRIGGER tri_insert

ONstd_TABLE ---指定目标表

FORINSERT---触发器类型

AS--别忘了这个

DECLARE@a CHAR(20), @name CHAR(20), @major VARCHAR(20)--注意这边貌似只能这样写,多个变量一起定义

--从临时表INSERTED中获取数据,数据保存在定义的变量中

--INSERTED保存着被插入或更新后的数据

SELECT@a =学号,@name =姓名,@major =专业方向FROMINSERTED

--删除时的对应操作,把获取的数据插入另一表中

INSERTINTO std_table1(学号,姓名,专业方向)VALUES(@a, @name, @major)

 

--测试

SELECT*FROM std_table

SELECT*FROM std_table1

--查看触发器的信息

execsp_helptrigger std_table

 

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
1月前
|
SQL 数据库
执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)之解决方案
执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)之解决方案
181 0
|
3月前
|
SQL 运维 监控
SQL Server 运维常用sql语句(二)
SQL Server 运维常用sql语句(二)
32 3
|
3月前
|
SQL XML 运维
SQL Server 运维常用sql语句(三)
SQL Server 运维常用sql语句(三)
22 1
|
3月前
|
Java 应用服务中间件 Maven
从零到英雄:一步步构建你的首个 JSF 应用程序,揭开 JavaServer Faces 的神秘面纱
【8月更文挑战第31天】JavaServer Faces (JSF) 是一种强大的 Java EE 标准,用于构建企业级 Web 应用。它提供了丰富的组件库和声明式页面描述语言 Facelets,便于开发者快速开发功能完善且易于维护的 Web 应用。本文将指导你从零开始构建一个简单的 JSF 应用,包括环境搭建、依赖配置、Managed Bean 编写及 Facelets 页面设计。
88 0
|
3月前
|
SQL 关系型数据库 MySQL
【超全整理】SQL日期与时间函数大汇总会:MySQL与SQL Server双轨对比教学,助你轻松搞定时间数据处理难题!
【8月更文挑战第31天】本文介绍了在不同SQL数据库系统(如MySQL、SQL Server、Oracle)中常用的日期与时间函数,包括DATE、NOW()、EXTRACT()、DATE_ADD()、TIMESTAMPDIFF()及日期格式化等,并提供了具体示例。通过对比这些函数在各系统中的使用方法,帮助开发者更高效地处理日期时间数据,满足多种应用场景需求。
303 0
|
3月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
325 0
|
SQL 数据库 索引
Sqlserver与access数据库sql语法十大差异
ACCESS结构简单容易处理,而且也能满足多数的网站程序要求,也是初学者的试牛刀。ACCESS是小型数据库,既然是小型就有他根本的局限性: 1)、数据库过大,一般ACCESS数据库达到50M左右的时候性能会急剧下降! 2)、网站访问频繁,经常超过100人的在线时,处理速度会有影响! 3)、记录数过多,一般记录数达到10万条左右的时候性能就会急剧下降!微软公司为了与ACCESS高低搭配的一种高端方案:改用了Sqlserver,但语法会有一些差异。
995 0
|
2月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
4月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
102 13
|
4月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。