第一篇:网络数据库讲稿(存储过程)
网络数据库讲稿
4/15/2013
存储过程
P177
一、什么是存储过程
1.是一个过程,与其它语言中的过程几乎完全相同。它们可以接收参数、输出参数、返回单个或多个结果集以及返回值。2.存储在服务器上的数据库中,创建时进行编译。3.在后台运行,其主要功能是对数据库操作。4.可以在一个存储过程内调用其它存储过程。
二、.存储过程的分类
分为三类:用户自定义存储过程(普通存储过程),扩展存储过程,系统存储过程。
三、创建普通存储过程
CREATE PROCEDURE命令 例: 1.CREATE PROCEDURE 检索 @XH CHAR(6)AS SELECT * FROM 成绩 WHERE 学号=@XH 2.在成绩表中添加一条记录,如果成绩及格,还要在学生表中增加学分。
CREATE PROCEDURE 输入考试分数
@XH CHAR(6),@KCH CHAR(8),@FS DECIMAL(4,1)AS IF EXISTS(SELECT * FROM 学生 WHERE 学号=@XH)BEGIN
INSERT 成绩 VALUES(@XH,@KCH,@FS)
IF @FS>=60
UPDATE 学生 SET 已修学分
=已修学分+(SELECT 学分 FROM 课程 WHERE 课程编号=@KCH)
WHERE 学号=@XH END ELSE PRINT '无此学号'+@XH
3.在成绩表中删除指定学号和课程的记录,如果所删的分数及格,还要在学生表中减去对应的学分。CREATE PROCEDURE 删除考试分数
@XH CHAR(6),@KCH CHAR(8)AS DECLARE @FS DECIMAL(4,1)SET @FS=(SELECT MAX(分数)FROM 成绩
网络数据库讲稿
4/15/2013 WHERE 学号=@XH AND 课程编号=@KCH)IF @FS>0 DELETE FROM 成绩 WHERE 学号=@XH AND 课程编号=@KCH IF @FS>=60 UPDATE 学生 SET 已修学分
=已修学分-(SELECT 学分 FROM 课程 WHERE 课程编号=@KCH)
WHERE 学号=@XH
四、执行存储过程
P183 例: EXECUTE 检索 '200202' 检索 '200202' INSERT 成绩0 EXECUTE 检索 '200202' EXECUTE 输入考试分数 '200209','W2020610',56 EXECUTE 输入考试分数 '200209','W2020610',88 EXECUTE 输入考试分数 '200209','L2030506',90 如果执行存储过程是批处理中的第一条语句,则可以省略EXEC。
五、参数
P185 1.输入参数 按位置传递 用参数名传递 使用默认值
2.输出参数
P187 虚参和实参后边都要加上OUTPUT。例P187: CREATE PROC 班级人数@N INT OUTPUT,@CID CHAR(6)='200201' AS SELECT @N=COUNT(*)FROM 学生WHERE 班级=@CID
DECLARE @M INT EXEC 班级人数@M OUTPUT,'200208' SELECT @M
DECLARE @M INT EXEC 班级人数@M OUTPUT SELECT @M
六、查看存储过程信息
select * from sys.sql_modules SELECT OBJECT_DEFINITION(OBJECT_ID('检索'))
网络数据库讲稿
4/15/2013 sp_helptext 检索
七、修改存储过程
八、删除存储过程
1.在对象资源管理器或查询窗口中删除 2.用命令DROP PROCEDURE删除。
第二篇:教学:数据库-存储过程资料
教学三:存储过程
一、教学目的
(1)掌握T-SQL流控制语句;(2)掌握创建存储过程的方法;(3)掌握存储过程的执行方法;(4)掌握存储过程的管理和维护。
二、教学内容
1、创建简单存储过程
(1)创建一个名为stu_pr的存储过程,该存储过程能查询出051班学生的所有资料,包括学生的基本信息、学生的选课信息(含未选课同学的信息)。要求在创建存储过程前请判断该存储过程是否已创建,若已创建则先删除,并给出“已删除!”信息,否则就给出“不存在,可创建!”的信息。
if exists(select name from sysobjects where name='stu_pr'and type='p')begin print '已删除!' drop procedure stu_pr end else print '不存在,可创建!' go create procedure stu_pr as select * from Student_20103322 left outer join SC_20103322
on(Student_20103322.Sno=SC_20103322.Sno)left outer join Course_20103322 on(Course_20103322.Cno=SC_20103322.Cno)where classno='051' 1
exec stu_pr
2、创建带参数的存储过程
(1)创建一个名为stu_proc1的存储过程,查询某系、某姓名的学生的学号、姓名、年龄,选修课程名、成绩。系名和姓名在调用该存储过程时输入,其默认值分别为“%”与“林%”。执行该存储过程,用多种参数加以测试。
if exists(select name from sysobjects where name='stu_proc1' and type='p')begin
print '已删除!' drop procedure stu_proc1 end else
print '不存在,可创建!' go create procedure stu_proc1 @Sdept char(8)='%',@Sname varchar(8)='林%' as select Sdept,Student_20103322.Sno,Sname,DATEDIFF(YEAR,Birth,GETDATE())age,Cname,Grade from Student_20103322,SC_20103322,Course_20103322 where Student_20103322.Sno=SC_20103322.Sno and Course_20103322.Cno=SC_20103322.Cno and Sdept like @Sdept and Sname like @Sname
execute stu_proc1 '计算机系','林红' 3
execute stu_proc1 '信息安全','胡光璟'
(2)创建一个名为Student_sc的存储过程,可查询出某段学号的同学的学号、姓名、总成绩。(学号起始号与终止号在调用时输入,可设默认值)。执行该存储过程。if exists(select name from sysobjects where name='Student_sc'and type='p')begin print '已删除!' drop procedure student_sc end else print '不存在,可创建!' go create procedure Student_sc @Sno1 char(8),@Sno2 char(8)as select Student_20103322.Sno,Sname,SUM(Grade)总成绩 from Student_20103322,SC_20103322,Course_20103322 where Student_20103322.Sno=SC_20103322.Sno and Course_20103322.Cno=SC_20103322.Cno and Student_20103322.Sno>=@Sno1 and Student_20103322.Sno<=@Sno2 group by Student_20103322.Sno,Sname
execute Student_sc '20110000','20110003' 5
3、创建带输出参数的存储过程
(1)创建一个名为Course_sum的存储过程,可查询某门课程考试的总成绩。总成绩可以输出,以便进一步调用。
if exists(select name from sysobjects where name='Course_sum'and type='p')begin print '已删除!' drop procedure Course_sum end else print '不存在,可创建!' go create procedure Course_sum @Cname varchar(20),@sum int output as select @sum=sum(Grade)from SC_20103322,Course_20103322 where Course_20103322.Cno=SC_20103322.Cno and Cname=@Cname
group by SC_20103322.Cno,Cname
declare @ping int exec Course_sum '高数',@ping output print '高数的考试总成绩为:'+cast(@ping as varchar(20))
(2)创建一执行该存储过程的批处理,要求当总成绩小于100时,显示信息为:“XX课程的总成绩为:XX,其总分未达100分”。超过100时,显示信息为:“XX课程的总成绩为:XX”。
declare @sum int
declare @Cname varchar(20)Exec Course_sum @cname,@sum out begin
if @sum <100 print cast(@cname as varchar)+'课程的总成绩为:'+cast(@sum as varchar)+ ',其总分未达分'
else
print cast(@cname as varchar)+'课程的总成绩为:'+cast(@sum as varchar)end
declare @sum int
declare @Cname varchar(20)set @Cname='高数' Exec Course_sum @cname,@sum out begin
if @sum <100 print cast(@cname as varchar)+'课程的总成绩为:'+cast(@sum as varchar)+ ',其总分未达分'
else
print cast(@cname as varchar)+'课程的总成绩为:'+cast(@sum as varchar)end
4、创建带重编译及加密选项的存储过程
创建一个名为update_sc、并带重编译及加密选项的存储过程,可更新指定学号、指定课程号的学生的课程成绩。(学号、课程号由调用时输入)
if exists(select name from sysobjects where name='update_sc'and type='p')begin print '已删除!' drop procedure update_sc end else print '不存在,可创建!' go create procedure update_sc
@sno char(8),@cno char(3),@grade tinyint with RECOMPILE , ENCRYPTION as update SC_20103322 set Grade=@grade
where Sno=@sno and Cno=@cno
declare @sno char(8),@cno char(3),@grade tinyint set @sno='20103322' set @cno='003' set @grade='100' exec update_sc @sno,@cno,@grade begin print cast(@sno as varchar)+'的'+cast(@cno as varchar)+'课程成绩为:'+cast(@grade as varchar)end
5、使用T-SQL语句管理和维护存储过程
(1)使用sp_helptext查看存储过程Student_sc的定义脚本
exec sp_helptext student_sc
(2)使用select语句查看Student_sc存储过程的定义脚本(提示:通过查询表sysobjects和表syscomments)
select *
from sysobjects,syscomments where name = 'Student_sc'
(3)将存储过程stu_pr改为查询学号为2011001的学生的详细资料。
alter procedure stu_pr as select * from Student_20103322 left outer join SC_20103322 on(Student_20103322.Sno=SC_20103322.Sno)left outer join Course_20103322 on(Course_20103322.Cno=SC_20103322.Cno)where Student_20103322.Sno='2011001'
(4)删除存储过程stu_pr。
drop procedure stu_pr
6、使用SQL Server Management Studio管理存储过程
(1)在SQL Server Management Studio中重新创建刚删除的存储过程stu_pr create procedure stu_pr as begin select * from Student_20103322 left outer join SC_20103322 on(Student_20103322.Sno=SC_20103322.Sno)left outer join Course_20103322 on(Course_20103322.Cno=SC_20103322.Cno)where Student_20103322.Sno='2011001' end
(2)查看存储过程stu_pr,并将该过程修改为查询051班女生的所有资料。
ALTER procedure [dbo].[stu_pr] as begin select * from Student_20103322 left outer join SC_20103322 on(Student_20103322.Sno=SC_20103322.Sno)left outer join Course_20103322 on(Course_20103322.Cno=SC_20103322.Cno)where Student_20103322.Sno='2011001' and Sex='女' end
(3)删除存储过程stu_pr
【完】
第三篇:网络数据库讲稿(查询)
网络数据库讲稿
一、简单的SELECT
P95 1.SELECT … FROM …(1)DISTINCT(2)TOP n [PERCENT](3)字段别名
有三种书写格式。
2.WHERE子句(SELECT … FROM … WHERE …)
P101(1)比较运算符(2)逻辑运算符
(3)范围运算符BETWEEN(4)列表(包含)运算符 IN(5)字符匹配运算符LIKE及通配符(6)空值NULL 3.ORDER BY子句(SELECT … FROM … WHERE … ORDER BY …)
P107 ORDER BY子句必须放在SELECT语句的最后。
4.GROUP BY子句(SELECT … FROM … WHERE …GROUP BY … ORDER BY …)P109(1)GROUP BY子句中的列名必须是原表中的列名,不能是别名。(2)当SELECT子句中有聚合函数时,GROUP BY子句实现分组统计。
(3)当SELECT子句中同时有字段名列和聚合函数列时,必须使用GROUP BY子句。例如
select 班级,SUM(已修学分)from 学生GROUP BY 班级
(4)在SELECT子句中出现的列名必须出现在GROUP BY子句中、或聚合函数中。GROUP BY子句中的列名则不一定出现在SELECT子句中。(5)ROLLUP返回第一个分组列的统计行。例如:
select 班级,性别,SUM(已修学分)from 学生GROUP BY 班级,性别WITH ROLLUP(6)CUBE是ROLLUP的扩展。(7)ALL短语
P109 select 班级,性别,SUM(已修学分)from 学生
WHERE已修学分>4 GROUP BY ALL 班级,性别
ALL不能与WITH同用。6.HAVING子句
(SELECT … FROM … WHERE …GROUP BY … HAVING … ORDER BY …)P111(1)HAVING应与GROUP BY配对使用,否则没必要使用。(2)HAVING的主要作用是第二次筛选。
(3)HAVING中可以包含聚合函数(WHERE中不可以)。
(4)HAVING中非聚合函数中的字段名,必须出现在GROUP BY中。(5)SELECT列表中命名的别名,不能在HAVING中使用。7.COMPUTE子句,按排序字段分组求和。
SELECT 姓名,分数FROM 学生,成绩WHERE 学生.学号=成绩.学号 ORDER BY 姓名COMPUTE SUM(分数)
SELECT 姓名,分数FROM 学生,成绩WHERE 学生.学号=成绩.学号 ORDER BY 姓名COMPUTE SUM(分数)BY 姓名
网络数据库讲稿
SELECT 姓名,分数FROM 学生,成绩WHERE 学生.学号=成绩.学号 ORDER BY 姓名COMPUTE SUM(分数)BY 姓名COMPUTE SUM(分数)
Compute By 必须与 Order By 子句一起使用,而且Compute By 子句中的统计列名列表也必须与之相同。
8.SELECT INTO,将查询结果保存到永久表中。
P136
二、多表查询
P112 1.内、外连接
内外连接中用ON<条件> 2.交叉连接
交叉连接中用WHERE<条件>,用WHERE<条件>的交叉连接等同于内连接。3.合并两个查询
(1)联合查询
P120 SELECT 员工编号,员工姓名,'员工信息表' FROM 员工信息WHERE 所任职位='经理' UNION SELECT 部门编号,部门名称,'部门信息表' FROM 部门信息
(2)INTERSECT
P305 SELECT 学号FROM 成绩表 INTERSECT SELECT 学号FROM 学生信息
(3)EXCEPT SELECT 学号FROM 学生信息 EXCEPT SELECT 学号FROM 成绩表
三、子查询
P121
第四篇:网络数据库讲稿(触发器)
网络数据库讲稿
3/26/2013
触发器
P191
一、触发器概述
1.是一种特殊的存储过程。
2.不能被显式调用,只能由一些特定的操作(命令)引发(激活),这些命令是:INSERT、DELETE、UPDATE、CREATE、ALTER、DROP、GRANT、DENY、REVOKE等。3.每个触发器由三部分组成
①触发器名称:命名规则与变量名、存储过程名相同; ②激活该触发器的操作(命令动词)。③一个存储过程。
4.使用触发器可强制实现数据的一致性和完整性。
二、触发器的分类(按引发命令分类)及其工作原理
1.DML触发器(表级)(1)触发器必须依附于某一个表(触发器必须被包含在某一个表中)。(2)激活该触发器的操作:可以是INSERT、DELETE、UPDATE之一。(3)当上述操作发生在包含触发器的表上时,触发器中的过程被自动执行。(4)支持两种类型的触发器: ①AFTER 可以为同一表的同一操作定义多个该类型的触发器,并可定义执行顺序; ②INSTEAD OF 同一表的同一操作只能定义一个该类型的触发器。(5)工作原理
P193 临时逻辑表INSERTED和DELETED。2.DDL触发器(数据库级和服务器级)(1)触发器必须依附于某一个数据库(触发器必须被包含在某一个数据库中)。
(2)激活该触发器的操作:可以是CREATE、ALTER、DROP、GRANT、DENY、REVOKE等之一。
(3)当上述操作发生在包含触发器的数据库上时,触发器中的过程被自动执行。(4)只有AFTER型触发器。
三、创建DML触发器
P194 用命令CREATE TRIGGER创建 例: 1.
CREATE TRIGGER 增加学生学分 ON 成绩
//只能增加一条记录
FOR INSERT AS DECLARE @XH CHAR(6),@KCH CHAR(8),@FS DECIMAL(4,1)SELECT @XH=学号,@KCH=课程编号,@FS=分数 FROM INSERTED IF @FS>=60
网络数据库讲稿
3/26/2013
UPDATE 学生 SET 已修学分
=已修学分+(SELECT 学分 FROM 课程 WHERE 课程编号=@KCH)
WHERE 学号=@XH 2.
CREATE TRIGGER 减少学生学分 ON 成绩 FOR DELETE AS UPDATE 学生 SET 已修学分=已修学分-(SELECT SUM(学分)FROM 课程 WHERE 课程编号 IN(SELECT DISTINCT 课程编号 FROM DELETED WHERE 学生.学号=DELETED.学号 AND 分数>=60))WHERE EXISTS(SELECT DISTINCT 课程编号 FROM DELETED WHERE 学生.学号=DELETED.学号 AND 分数>=60)3.CREATE TRIGGER 修改学生学分 ON 成绩 FOR UPDATE AS UPDATE 学生 SET 已修学分=已修学分-(SELECT SUM(学分)FROM 课程 WHERE 课程编号 IN(SELECT DISTINCT 课程编号 FROM DELETED WHERE 学生.学号=DELETED.学号 AND 分数>=60))WHERE EXISTS(SELECT DISTINCT 课程编号 FROM DELETED WHERE 学生.学号=DELETED.学号 AND 分数>=60)UPDATE 学生 SET 已修学分=已修学分+(SELECT SUM(学分)FROM 课程WHERE 课程编号 IN(SELECT DISTINCT 课程编号 FROM INSERTED WHERE 学生.学号=INSERTED.学号 AND 分数>=60))WHERE EXISTS(SELECT DISTINCT 课程编号 FROM INSERTED WHERE 学生.学号=INSERTED.学号 AND 分数>=60)
4.“修改学生学分”也可改为:
CREATE TRIGGER 修改学生学分 ON 成绩 FOR UPDATE AS UPDATE 学生 SET 已修学分=(SELECT SUM(学分)FROM 课程 WHERE 课程编号 IN
网络数据库讲稿
3/26/2013(SELECT 课程编号 FROM 成绩
WHERE 学生.学号=成绩.学号 AND 分数>=60))
然后可执行下列命令,并检验执行结果。
--INSERT INTO 成绩 VALUES('200202','L2020308',83)--INSERT INTO 成绩 VALUES('200202','L2030501',80)--INSERT INTO 成绩 VALUES('200202','L2030506',75)--DELETE FROM 成绩 WHERE 学号='200202' AND LEFT(课程编号,1)='L'--UPDATE 成绩 SET 分数=80 WHERE 学号='200202' AND LEFT(课程编号,1)='L'
四、创建DDL触发器
P198 例: 1.P199 2.CREATE TRIGGER 禁删数据库ON ALL SERVER FOR DROP_DATABASE AS PRINT '请不要删除数据库!' ROLLBACK TRANSACTION
DROP DATABASE 订货管理
五、嵌套触发器和递归触发器
P199, P200
六、管理触发器
P201 1.查看 2.修改 3.禁用 4.删除
--根据成绩表计算每个学生的已修学分
update 学生set 已修学分=(select sum(学分)from 课程 where 课程编号in(select 课程编号from 成绩where 学生.学号=成绩.学号 and 分数>=60))
--修改插入触发器,使得向成绩表中插入多条记录,也能成功执行 CREATE TRIGGER 插入学生学分ON 成绩 FOR insert
网络数据库讲稿
3/26/2013 AS UPDATE 学生SET 已修学分=已修学分+(SELECT SUM(学分)FROM 课程 WHERE 课程编号IN(SELECT DISTINCT 课程编号FROM inserted WHERE 学生.学号=inserted.学号AND 分数>=60))WHERE EXISTS(SELECT DISTINCT 课程编号FROM inserted WHERE 学生.学号=inserted.学号AND 分数>=60)
select * from 成绩
select 学号,已修学分from 学生
INSERT INTO 成绩VALUES('200202','L2020308',83)INSERT INTO 成绩VALUES('200202','L2030501',80)INSERT INTO 成绩VALUES('200202','L2030506',75)INSERT INTO 成绩VALUES('200201','L2020308',83)INSERT INTO 成绩VALUES('200201','L2030501',80)INSERT INTO 成绩VALUES('200201','L2030506',75)
select * into 备份成绩from 成绩 //备份成绩表 select 学号,姓名,已修学分from 学生
insert into 成绩 select * from 成绩
INSERT INTO 成绩VALUES('200212','L2030506',75)
第五篇:网络数据库讲稿(复制)
网络数据库讲稿
4/20/2013
一、复制的基本概念
SQL Server复制是在数据库之间对数据和数据库对象进行复制和分发并且对于数据的修改进行同步,以确保其一致性的一组技术。使用复制可以将数据分发到不同位置,通过局域网、Internet分发给多个远程服务器站点;还可将多个用户和站点的数据进行合并。
二、复制模型
复制技术采用发布(出版)——订阅模型分发数据。
SQL Server复制模型由下列对象组成:发布服务器,分发服务器,订阅服务器,发布,项目,订阅。还有几个负责在发布服务器和订阅服务器之间复制和移动数据的复制进程:快照代理程序,分发代理程序,日志读取器代理程序,队列读取器代理程序,合并代理程序。1.服务器角色
参与复制的服务器根据任务不同可划分为以下角色: ①发布服务器:数据源所在的服务器。
②分发服务器:将出版物从发布服务器移动到订阅服务器。③订阅服务器 2.项目
3.发布(出版物)4.订阅 5.复制的类型 ①快照复制 ②事务复制 ③合并复制 6.复制代理程序
①快照代理程序:与所有复制类型一起使用。
②分发代理程序:与快照复制和事务复制一起使用。③合并代理程序:与合并复制一起使用。
④日志读取器代理程序:与事务复制一起使用。
⑤队列读取器代理程序:与快照复制或事务复制一起使用。
三、服务器的连接方式
1.发布服务器与分发服务器为同一物理服务器 2.发布服务器与分发服务器为不同物理服务器 3.发布者与再次发布者连接方式
4.多发布服务器单订阅服务器连接方式
四、配置复制
复制一般包括以下几个阶段:配置发布和分发,生成和应用初始快照,修改复制数据,同步和传播数据。
复制过程中各代理程序的调度由SQL Server Agent服务管理,应配置SQL Server Agent服务能够在系统启动的时候自动启动,并且在意外停止时能够自动重新启动,由于复制操作跨越多个服务器传输数据,所以SQL Server Agent服务的启动帐号应使用域用户帐号。1.配置分发服务器
网络数据库讲稿
4/20/2013 分发服务器是快照复制和事务复制的首要组件。在企业管理器中运行向导,右击【复制】,单击【配置发布、订阅服务器和分发】启动【配置发布和分发向导】。然后按提示进行。
配置完成后,系统在分发服务器上创建distribution系统数据库、复制文件夹、复制监视器。
2.配置发布服务器和创建出版物
出版物是准备发布的表、表中数据的子集或其它数据库对象的集合。出版物是订阅的单元。
在企业管理器中运行向导,右击【复制】,单击【新建/发布】启动【创建发布向导】,然后按提示进行。
在“指定项目”步骤,单击“项目默认值”或“对象”右端的省略号按钮,可设置快照属性。
可循环创建多个发布。
可查阅和修改已建发布的属性。
3.订阅
订阅是对发布到指定订阅服务器的数据或数据库对象的请求。一个订阅服务器可以向不同发布请求多个订阅。
订阅可在发布服务器上创建(强制订阅)或在订阅服务器上创建(请求订阅)。(1)强制订阅
在企业管理器中:工具/向导,展开【复制】,启动【创建强制订阅向导】,然后按提示进行。
(2)请求订阅 在企业管理器中:工具/向导,展开【复制】,启动【创建请求订阅向导】,然后按提示进行。
也可按教材P175的例子,先创建发布,再配置发布和分发服务器,最后创建订阅。