CREATE FUNCTION [owner_name.]function_name
(@parameter_name scalar_parameter_data_type [,...n])
RETURNS @局部变量 TABLE <返回表的定义>
AS
BEGIN
函数体
RETURN
END
(5)删除用户定义函数
语法格式:DROP FUNCTION [{owner_name.} function_name] [,...n]。
owner_name:所有者名;
function_name:要删除的用户定义函数名称;
n:可指定多个函数同时删除。
(6)实战训练
在数据库中创建用户自定义函数SearchXuefen3,查询学分大于 2 分的课程信息。任务步骤:
创建SearchXuefen3函数;
定义参数@xuefen(输入参数)、局部变量@xuefeninfo(存放返回表)并定义表结构;
函数体生成符合条件的课程信息表;
调用函数测试结果。
-- 方法1:内嵌表值函数实现
-- 创建内嵌表值函数SearchXueFen3
CREATE FUNCTION SearchXueFen3(@xuefen numeric(5,2))
RETURNS table
AS
RETURN(
select Cno,Cname,Teacher,Credit
from course
where Credit>@xuefen)
go
-- 调用函数查询学分大于2的课程
SELECT * FROM SearchXueFen3(2)
-- 方法2:多语句表值函数实现
-- 创建多语句表值函数SearchXueFen3
CREATE FUNCTION SearchXueFen3(@xuefen numeric(5,2))
RETURNS @xuefeninfo table
(
cno nvarchar(50),
cname nvarchar(50),
teacher nvarchar(50),
credit numeric(5,2)
)
AS
BEGIN
insert @xuefeninfo
select Cno,Cname,Teacher,Credit
from course
where Credit>@xuefen
return
END
go
USE SCC
GO
-- 创建临时存储过程
CREATE PROCEDURE #AddTestTableProc
WITH ENCRYPTION
AS
CREATE TABLE Test(
TestNo nvarchar(20) not NULL PRIMARY KEY,
TestName nvarchar(30),
TestTime date,
TestNumber int)
GO
USE SCC
GO
CREATE PROCEDURE SelectCourseProc
@credit FLOAT
AS
SELECT * FROM Course WHERE Credit=@credit
GO
EXEC SelectCourseProc 2;
EXEC SelectCourseProc @credit=2;
GO
USE SCC;
GO
IF EXISTS(SELECT * FROM sys.objects WHERE
name='SelectStuCourseProc')
DROP PROC SelectStuCourseProc
GO
CREATE PROCEDURE SelectStuCourseProc
@specialty nvarchar(30)='计算机网络技术',
@className nvarchar(30)='物联 3182'
AS
SELECT c.Specialty as 专业,c.ClassName as 班级,s.Sno as 学号,s.Sname as 姓名,
co.Cname as 所修课程名,sc.EndScore as 最终成绩
FROM Class c JOIN Student s ON c.ClassNo=s.ClassNo
JOIN Score sc ON s.Sno=sc.Sno
JOIN Course co ON sc.Cno=co.Cno
WHERE c.Specialty=@specialty OR c.ClassName=@className
GO
USE SCC
GO
EXEC SelectStuCourseProc;
EXEC SelectStuCourseProc '软件技术','物联 3181';
EXEC SelectStuCourseProc '软件技术';
EXEC SelectStuCourseProc @className='网络 3182',@specialty='物联网应用技术';
GO
USE SCC;
GO
CREATE PROCEDURE SelectStuCountProc
@cName NVARCHAR(30),
@stuCount INT OUTPUT
AS
SELECT @stuCount=COUNT(*)
FROM Score sc JOIN Course co ON sc.Cno=co.Cno
WHERE co.Cname=@cName
GO
USE SCC
GO
DECLARE @stuCount INT;
DECLARE @cName NVARCHAR(30)='数据库应用';
EXEC SelectStuCountProc @cName,@stuCount OUTPUT;
SELECT '选修课程《'+@cName+'》的有'+LTRIM(STR(@stuCount))+'人'
GO
CREATE TRIGGER 触发器名
ON 表名 | 视图名
FOR | AFTER | INSTEAD OF [INSERT , DELETE ,UPDATE]
AS T-SQL语句
参数说明:FOR | AFTER | INSTEAD OF,如果单指定关键字 FOR,则默认为 AFTER 关键字。AFTER 关键字表示指定的 SQL 语句全部都执行后才触发,且视图不能定义 AFTER 触发器。INSTEAD OF 关键字表示在指定的 SQL 语句执行前,将其替换为触发器的 T-SQL 语句进行执行。
(2)使用 T-SQL 语句创建 DDL 触发器
语法格式如下:
复制代码
CREATE TRIGGER 触发器名
ON ALL SERVER | DATABASE
FOR | AFTER event_type | event_group
AS T-SQL语句
参数说明:FOR | AFTER,DDL 触发器只能指定 FOR 或 AFTER 触发器,和 DML 触发器有相同的功能。但是 DDL 没有 INSTEAD OF 类型触发器。
--创建一个触发器,当用户向表Course中添加新记录后触发
CREATE TRIGGER Insert_Course
ON Course
AFTER INSERT
AS
BEGIN
--先判断是否存在CountTable,如果不存在则创建该表
IF NOT EXISTS(SELECT * FROM sys.objects WHERE name='CountTable')
--创建包含课程总数和学生总数的表CountTable
CREATE TABLE CountTable(courseCount INT DEFAULT 0,
studentCount INT DEFAULT 0);
DECLARE @courCount INT; --声明一个变量用于保存课程总数
--获得Course表中课程总数
SELECT @courCount=COUNT(*) FROM Course;
--如果表CountTable表中没有记录,则插入一条记录,初始值为0
IF NOT EXISTS(SELECT * FROM CountTable)
INSERT INTO CountTable VALUES(0,0);
--更新表CountTable中字段courseCount的值为刚获得的课程总数
UPDATE CountTable SET courseCount=@courCount;
END
SELECT COUNT(*) AS Course表课程数 FROM Course
INSERT INTO Course VALUES('c090','移动物联网开发','张宏',5.0,60,72)
SELECT COUNT(*) AS Course表课程数 FROM Course
SELECT * FROM CountTable
GO
USE SCC
GO
--创建一个触发器,在用户向表CountTable新增数据时被禁止
CREATE TRIGGER Forbid_Insert_CountTable
ON CountTable
AFTER INSERT
AS
BEGIN
RAISERROR('不允许直接向该表插入记录,操作被禁止',1,1)
ROLLBACK TRANSACTION --回滚事务,撤销插入操作
END
GO
USE SCC
GO
--创建一个DELETE触发器,用户删除表Course的数据时触发
CREATE TRIGGER Delete_Course
ON Course
AFTER DELETE
AS
BEGIN
DECLARE @courCount INT; --声明一个变量用于保存课程总数
--获得Course表中课程总数
SELECT @courCount=COUNT(*) FROM Course;
--更新表CountTable中字段courseCount的值为刚获得的课程总数
UPDATE CountTable SET courseCount=@courCount;
SELECT * FROM deleted
END
GO
USE SCC
GO
--创建一个UPDATE触发器,用户更新表Score的数据时触发
CREATE TRIGGER Update_Score
ON Score
AFTER UPDATE
AS
BEGIN
SELECT Sno,Cno,Uscore AS 更新前Uscore,EndScore AS 更新前EndScore
FROM deleted
SELECT Sno,Cno,Uscore AS 更新后Uscore,EndScore AS 更新后EndScore
FROM inserted
END
GO