SQL数据库函数、存储过程触发器

SQL数据库函数、存储过程触发器

USE student_sql
/*定义一个变量,显示其值*/
	DECLARE @_A TINYINT
	SET @_A = 45
	SELECT @_A 
/*定义一个字符串,为其赋值"Welcome to HQU”*/
	DECLARE @_B CHAR(20)
	SET @_B = 'Welcome to HQU'
	SELECT @_B
/*创建局部变量@_SNO(学号)并赋值为某个学号,
然后输出数据库学生表中等于该值的学生的学号、
姓名、性别、所属院系信息;***************/
	DECLARE @_SNO CHAR(10)
	SET @_SNO = 'S001'
	SELECT * FROM Student
		WHERE Snum = @_SNO
/*计算选课表中学生最高成绩和最低成绩之差,并将结果付给@_drop*/
	DECLARE @_SCORE_MAX INT ,@_SCORE_MIN INT 
	SELECT @_SCORE_MAX = MAX(Score) FROM SC
	SELECT @_SCORE_MIN = MIN(Score) FROM SC
	SELECT @_SCORE_MAX - @_SCORE_MIN
/*调用全局变量,查询当前数据库服务器名*/
	SELECT @@SERVERNAME
/*查询当前数据库服务器名*/
	SELECT @@SERVERNAME
/*定义一标量函数,数据库中创建一个标量值函数Sum(n),求1+2+…+n之和。并用相关数据进行测试。*/
	GO
	CREATE FUNCTION SUN(@_N INT)  RETURNS INT 
		AS	
		BEGIN
			DECLARE @_SUU INT
			SET @_SUU = 0		--变量必须赋初值
			WHILE (@_N > 0)
				BEGIN
				SET @_SUU = @_SUU + @_N
				SET @_N = @_N - 1
				END
			RETURN @_SUU
		END
	GO
	drop function SUN
	SELECT dbo.SUN(100)
/*定义一标量函数,按系别统计当前所有学生的平均年龄,并调用该函数。
提示:AVG,DATEDIFF。并调用该函数,系别自选。********************/
	CREATE FUNCTION WE(@_RR CHAR(10))  RETURNS INT
		AS 
		BEGIN
			DECLARE @EE INT
			SET @EE = 0
			SELECT @EE=AVG(DATEDIFF(YEAR,Sbirth,2018)) FROM Student
				WHERE Sdept = @_RR
			RETURN @EE
		END
	DROP FUNCTION WE
	SELECT dbo.WE('计算机')
/*定义一表值函数,通过姓名查询某学生的学号、性别、所属院系、选修课程名及成绩。*/
	
	CREATE FUNCTION RR(@TT CHAR(10)) RETURNS TABLE
		AS
		RETURN 
			SELECT Snum,Ssex,Sdept,Cnum,Score FROM Student,SC
				WHERE SC.Sunm = Student.Snum AND Sname= @TT
	DROP FUNCTION RR
	SELECT dbo.RR('李勇')
/*创建一个无参存储过程pro_StuScore,查询以下信息:班级、学号、姓名、性别、课程名称、考试成绩。*/
	CREATE PROC pro_StuScore 
	AS	
		SELECT Snum,Sname,Ssex,Cname,Score FROM Student,SC,Couse
		WHERE Student.Snum=SC.Sunm AND SC.Cnum=Couse.Cnum
	EXEC pro_StuScore
	DROP pro_StuScore
/*创建查询每个学生的修课总学分的存储过程pro_sumcredit,
要求列出学生学号及总学分。提示:sum聚和函数,多表连接。*/
	CREATE PROC  pro_sumcredit
	AS
		SELECT Sunm,SUM(Score) FROM SC
		GROUP BY Sunm
	DROP pro_sumcredit
	EXEC pro_sumcredit
/*查询学生的学号、姓名、选修的课程号、课程名、课程学分,
将学生所在院系作为输入参数,默认值“计算机”。
执行此存储过程,并分别指定一些不同的输入参数值,
比如:没有给任何输入参数,输入参数为“信息”、“生物工程”等查看执行结果。*/
	CREATE PROC MM @TT  CHAR(10) = '计算机'
		AS
		SELECT Snum,Sname,Cname,Ccredit FROM Student,SC,Couse
		WHERE Student.Snum=SC.Sunm AND SC.Cnum= Couse.Cnum	AND Sdept=@TT
	DROP MM
	EXEC MM
	DECLARE @PPU CHAR(10)
	SET @PPU = '生物工程'
--	EXEC MM @PPU
/*创建存储过程,查询指定系的男生人数,其中系为输入参数,人数为输出参数。*/
	CREATE PROC CC @VV CHAR(10),@FF INT OUTPUT
		AS
			SELECT @FF=COUNT(*) FROM Student
			WHERE Sdept=@VV AND Ssex='男'
	DROP CC
	DECLARE @J INT ,@KKJ CHAR(10)
	SET @J=0
	SET @KKJ='计算机'
	EXEC CC @KKJ,@J OUTPUT
	SELECT @J
/*创建触发器,限制学生的出生年龄必须在1999~2000年之间。
(拓展选做题:限制学生的年龄在15-45之间。)*/
	CREATE TRIGGER NN ON Student
	FOR INSERT 
	AS
		DECLARE @SAGE  AS DATETIME
		SELECT @SAGE = i.Sbirth FROM inserted i 
		IF @SAGE>2000 OR @SAGE <1999
			BEGIN
			PRINT '不允许'
			ROLLBACK TRAN
			END
		ELSE PRINT '插入成功' 
	INSERT INTO Student VALUES	('S0022','李勇','男','计算机',	'2000.3.25',180808081,'福建')
	INSERT INTO Student VALUES	('S0022','李勇','男','计算机',	'1999.3.25',180808081,'福建')
/*(拓展选做题:限制学生的年龄在15-45之间。)*/
	CREATE TRIGGER NN ON Student
	FOR INSERT 
	AS
		DECLARE @SAGE  AS DATETIME		
		SELECT @SAGE = i.Sbirth FROM inserted i 
		DECLARE @JKJ INT
		SET @JKJ = DATEDIFF(YEAR,@SAGE,2019)
		IF @JKJ>45 OR @JKJ <15
			BEGIN
			PRINT '不允许'
			ROLLBACK TRAN
			END
		ELSE PRINT '插入成功' 
/*限制每个学期开设的课程总学分在20-30范围内*/
	CREATE TRIGGER hh ON Couse
		FOR INSERT 
		AS
			DECLARE @JJJ  AS INT
			SELECT @JJJ = i.Ccredit FROM inserted i 
			IF @JJJ>30 OR @JJJ <20
				BEGIN
				PRINT '不允许'
				ROLLBACK TRAN
				END
			ELSE PRINT '插入成功' 
	INSERT INTO Couse VALUES	('c084','大学英语',3,1,'必修','T001')
/*当删除表student中的记录时,自动删除表sc中对应学号的记录。*/
	CREATE  TRIGGER FF ON Student
		FOR DELETE 
		AS
			DECLARE @BBB  AS CHAR(10)
			SELECT @BBB = d.Snum FROM deleted d 
			IF  EXISTS (SELECT Sunm FROM SC 
								WHERE Sunm=@BBB)
			DELETE FROM SC WHERE Sunm=@BBB
	DELETE FROM Student WHERE Snum='s0011'
/*(instead of触发器)创建一视图学生表下的Student_view,包含学号、姓名、课程号、课程名、成绩等属性,
在Student_view上创建一个触发器Grade_moidfy,当对Student_view中的学生的成绩进行修改时,
实际修改的是选课表中的相应记录。************************************************************/
	CREATE  VIEW stu_CS AS SELECT Snum,Sname,Cname,Score FROM Student,Couse,SC
		WHERE Student.Snum=SC.Sunm AND SC.Cnum=Couse.Cnum
	DROP VIEW stu_CS
	CREATE TRIGGER Grade_moidfy ON stu_CS
		INSTEAD OF INSERT 
		AS
			DECLARE @_Snum CHAR(10),
					@_Sname CHAR(10),
					@_Cname CHAR(10),
					@_Score INT
			SET @_Snum= (SELECT Snum FROM inserted)
			SET @_Sname= (SELECT Sname FROM inserted)
			SET @_Cname= (SELECT Cname FROM inserted)
			SET @_Score= (SELECT Score FROM inserted)
			INSERT SC
			VALUES(@_Snum,NULL,@_Score)
	INSERT stu_CS VALUES('S66',NULL,NULL,NULL,55)
---------------查看数据库已有触发器
	SELECT name  FROM sysobjects WHERE name='FF' and xtype='TR'
-- 查看单个触发器内容
	 exec sp_helptext 'FF'
发布了11 篇原创文章 · 获赞 2 · 访问量 466

猜你喜欢

转载自blog.csdn.net/qq_41784284/article/details/103189617