use xsgl
go
/*
自定义函数
--标量函数
--表值函数
--内联表值函数
--多语句表值函数
在函数调用的过程中,可以用 select print exec
定义函数时就注意:
1.在函数的返回值时,如果有返回值,那以要将该返回值赋值给一个与返回类型类型一样的变量,然后将返回值返回
2.在函数执行时,一个要加dbo.functionname 不然会提示找不到函数
3.函数内部不能有select print 等返回数据
4.内联表值函数其实就是返回值是一个表,在其调用时,也要向一个表一样调用
select * from functionname
5.表值函数在返回值时,insert @info
select id,name from student where id=@id
return
*/
select * from deleted
创建标量函数
create function getName (@id int )
returns char(10)
as
begin
declare @name char
select @name=name from student where id=@id
return @name
end
select dbo.getName(1)
create function max2(@a real,@b real)
returns real
as
begin
declare @temp real
if @a>@b
set @temp =@a
else
set @temp = @b
return @temp
end
-- 内联表值函数
create function getinfo(@id int)
returns @info table
(
id int ,
name char(10)
)
as
begin
insert @info -------这一句很重要,不过不知道什么意思
select id,name from student where id=@id
return
end
select * from student
select * from dbo.getinfo(1)
---------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------
/*
存储过程
1. 运行SQL 语句的方法有两种,一种是保存源码,然后考贝运行,再者就是使用存储过程,将编译后的SQL语句存储在数据库内存中
那么以后可以直接使用execute 来执行
2. 存储过程的分类:
1.系统存储过程: 位置master 数据库中,以sp 开头
2.用户自定义存储过程
3. 对于经常性的操作,我们可以定义为存储过程,这样就避免了数据在客户端与服务之间的来回传输,提交效率
*/
exec sp_stored_procedures --查看当前环境中的所有存储过程
--创建存储过程,用于查询学生信息
create procedure queryid @id int
as
select * from student where id = @id
---------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------
触发器
触发器是在表或视图被修改时才调用的,如果调用某个事件,可能会触发某个触发器,这样就引起敢触发器的调用
触发器不能显示调用,而是在表被修改改被自动调用
触发器的各类
--DML触发器 针对 insert delete update
--DDl 触发器 针对 create alter drop
-- 级联删除,定义一个触发器,在删除 student 表中的数据时,把exam 表中的与之相应对应的数据也删除掉
如:student exam 两个表 student 表中Id为主键。 exam 中stu_id cau_id 为主键, stu_id 为引用student 表的外键
那么,如果要想删除 student 表中的Id某个数据,而exam 表中也有些ID的信息,那么就会删除失败
所以此时就要用到触发器,在删除时也可以称为级联删除,即在删除 student 表中Id信息时,会触发 定义在student表中delete
事件的触发器,然后执行触发器,将 exam表中的数据也删除,DML触发器是相对于某个表中的某个事件来处理的,(注意:因为src还在引用、
student 表中的数据,所以会删除失败,我们要在创建表的时候声明级联删除:
)
只有在定义的
这个表的这个事件被执行,触发器才会被执行,而不参显示的执行触发器。
create trigger joindel on student
for delete
as
delete from exam where stu_id=(select stu_id from deleted)
drop trigger joindel
select * from student
delete from student where id = 1
select * from student
select * from exam
delete from student where id =2
select * from student
select * from exam
--insert into exam values(100,3,2)
delete from student where id =10
------ 级联删除(修改)
create table exam2
(
stu_id int not null,
cau_id int not null,
grade int ,
constraint pk2 primary key(stu_id,cau_id),
constraint fk21 foreign key(stu_id) references student(id) on delete cascade, -- 声明级联
constraint fk22 foreign key(cau_id) references cause(id)
)
--把数据导入 将table2中的数据导入到table1中
1. select * into talbe2 from table1 (table2 必需为新表)
2 .insert into table1
select * from table2
在建立表的时候,在建立外键的时候,加上 on delete cascade 级联删除
on update cascade 级联修改
select * into exam3-- exam2 必需是新表才可以,如果不是,则表提示表已存在
from exam
drop table exam3
insert into exam2
select * from exam
select * from exam2
delete from student where id = 3