
第9章存储过程、触发器 能力目标:能根据项目需求设计存储过程 能根据项目需求设计触发器
第9章 存储过程、触发器 能力目标:能根据项目需求设计存储过程 能根据项目需求设计触发器

存储过程的概念 存储过程是一个可重用的代码模块,可以 高效率地完成指定的操作。 存储过程是SQL Server服务器上一组预先定 义并编译好的Transact-SQL语句,它可以接 受参数、返回状态值和参数值
第2页 存储过程的概念 • 存储过程是一个可重用的代码模块,可以 高效率地完成指定的操作。 • 存储过程是SQL Server服务器上一组预先定 义并编译好的Transact-SQL语句,它可以接 受参数、返回状态值和参数值

存储过程的类型 -用户定义的存储过程(掌握) -扩展存储过程 指用户可以使用外部程序语言编写的存储过程, 以xp_开头 一系统存储过程 主要存储在master数据库中并以sp为前缀 如:exec sp_.helpdb
第3页 存储过程的类型 – 用户定义的存储过程(掌握) – 扩展存储过程 指用户可以使用外部程序语言编写的存储过程, 以xp_开头 – 系统存储过程 主要存储在master数据库中并以sp_为前缀 如:exec sp_helpdb

创建存储过程 T-SQL语句 create proc[edure]存储过程名称 [@参数数据类型[output]][.n] as SQL语句 执行调用:exec[ute]存储过程名参数值
第4页 创建存储过程 • T-SQL语句 create proc[edure] 存储过程名称 [@参数 数据类型 [output] ] [, …n] as SQL语句 执行调用:exec [ute]存储过程名参数值

数不带参数的存储过程 例1:建立一个存储过程,起名为“pro_name”。 作用是从学生表中查询李超的学生信息。 存储过程名 创建存储过程: create proc pro_name as select*from学生where姓名=李超 调用执行: exec pro_name
不带参数的存储过程 创建存储过程: create proc pro_name as select * from 学生 where 姓名=‘李超' 存储过程名 调用执行: exec pro_name 例1:建立一个存储过程,起名为“pro_name”。 作用是从学生表中查询李超的学生信息

带参数的存储过程 create proc pro_name1 @name char(8) as select*from学生where姓名=@name exec pro_name1刘丽
• create proc pro_name1 @name char(8) as select * from 学生 where 姓名=@name • exec pro_name1 ‘刘丽' 带参数的存储过程

香询某火指定课程的成绩和学分 0 create proc p2 @name char(8),@cname char(20) as select成绩,学分from学生,课程,成绩where学 生.学号=成绩.学号and成绩.课程号=课程.课程 号and姓名=@name and课程名称=@cname exec p.2'刘丽,'程序设计
查询某人指定课程的成绩和学分 • create proc p2 @name char(8),@cname char(20) • as • select 成绩,学分from 学生,课程,成绩where 学 生.学号=成绩.学号and 成绩.课程号=课程.课程 号and 姓名=@name and 课程名称=@cname • exec p2 '刘丽','程序设计

例:学生成绩管理数据库中,查询有无某某的同学。如有 输出,“某某的年龄是:”提示文字及相应的年龄,如果 没有给出“查无此人”的提示。 create proc p1 @name char(8) as if exists(select*from学生where姓名=@name) Begin ● Declare @a int select@a=year(getdate()-year(出生时间)from学生where姓名=@name Print@name+'的年龄是:+convert(char(2),@a) end ● else print'查无此人' exec p1李超
• create proc p1 @name char(8) • as • if exists(select * from 学生where 姓名=@name) • Begin • Declare @a int • select @a=year(getdate())-year(出生时间) from 学生where 姓名=@name • Print @name+'的年龄是:'+convert(char(2),@a) • end • else • print '查无此人' • exec p1 '李超' 例:学生成绩管理数据库中,查询有无某某的同学。如有 输出, “某某的年龄是:”提示文字及相应的年龄,如果 没有给出“查无此人”的提示

带多个输入参数存储过程 ·输入任意3个数,输出最大的。 create proc p4 @a int,@b int,@c int as declare @max int if @a>@b set @max=@a else set @max=@b if @c>@max set @max=@c select最大者=@max exec p4@a=18,@b=10,@c=30
带多个输入参数存储过程 • 输入任意3个数,输出最大的。 • create proc p4 @a int,@b int,@c int as declare @max int if @a>@b set @max=@a else set @max=@b if @c>@max set @max=@c select 最大者=@max • exec p4 @a=18,@b=10,@c=30

使用OUTPUT参数执行存储过程 create proc p4 @a int,@b int=110,@c int,@max int output As if@a>@b set @max=@a else set @max=@b if @c>@max set @max=@c declare @d int exec p4 18,default,130,@d output print @d
使用OUTPUT参数执行存储过程 • create proc p4 @a int,@b int=110,@c int,@max int output As if @a>@b set @max=@a else set @max=@b if @c>@max set @max=@c • declare @d int • exec p4 18,default,130,@d output • print @d