SQL 函数、存储过程、触发器、级联删除、数据批量导入

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值