实验五 数据库编程
一、实验目的及要求
1. 常见系统函数的使用方法。
2. 存储过程的使用方法。
3. 触发器的使用方法。
二、实验任务
1. 常见系统函数的操作。
2. 创建触发器。
3. 创建和调用存储过程。
三、操作要点
1.掌握T-SQL基本语法
2.建立对象时应该先排查在系统表中是否有相同名字的对象。
四、注意事项
1.调用存储过程时传递参数。
2.触发器不接受用户应用程序传递的参数。
五、实验学时:6学时
六、实验重点及难点
1. 函数的使用方法和技巧。
2. 创建和调用存储过程的语法。
3. 创建触发器的语法。
七、实验步骤
第一部分:
7.1 建库、表并建立索引
建立数据库Company并建立Employees,Department表,请设计各表,注意主码、外码。自行插入若干虚拟数据:
CREATE DATABASE Company
ON
(NAME=University_Data,
FILENAME='D:\SQLSHUJU\Company.mdf',
SIZE=100MB,
MAXSIZE=200,
FILEGROWTH=20
)
LOG ON
(NAME=University_Log,
FILENAME='D:\SQLSHUJU\Company.ldf',
size=100mb,
maxsize=200,
filegrowTh=20)
go
2)Department应包括的属性有:部门代码departmentID、部门名称 deptname、部门简介deptmemo。
Create table Department
(
departmentID smallint,
deptname varchar(20),
deptmemo varchar(40),
PRIMARY KEY(departmentID)
)
1)Employees应包括的属性有:职员代码staffid、卡号idcard、姓名realname、性别esex、生日birthday、婚姻状况marriage、所属部门代码departmentID、职别Position、基本工资Salary。
create table Employees
(staffid char(9),
idcard smallint,
realname varchar(20),
esex CHAR(2),
birthday DATE,
marriage CHAR(4),
departmentID smallint,
Position CHAR(10),
Salary SMALLMONEY,
PRIMARY KEY (staffid),
FOREIGN KEY(departmentID)references Department(departmentID)
)
3)在Employees表中建立对birthday按降序,marriage按升序建立索引;对idcard建立唯一索引
Create index IX_Employees_birthday ON Employees(birthday DESC)
Create index IX_Employees_marriage ON Employees(marriage)
Create unique index IX_Employees_idcard ON Employees(idcard)
7.2 使用函数实现以下问题:
(1)计算9的4次方值。
select POWER(9,4)

(2)保留浮点值3.14159小数点后面2位。
SELECT CONVERT(DECIMAL(3,2),3.14159)

(3)分别计算字符串“Hello World!”和“University”的长度。
select len('Hello World!'),len('University')

(4)从字符串“Nice to meet you!”中获取子字符串“meet”。
select SUBSTRING('Nice to meet you!',9,4)

(5)除去字符串“h e l l o”中的空格。
SELECT replace('h e l l o',' ','')

(6)将字符串“SQLServer”逆序输出。
select REVERSE('SQLServer')

(7)在字符串“SQLServerSQLServer”中,从第4个字母开始查找字母Q第一次出现的位置。
SELECT CHARINDEX('Q','SQLServerSQLServer',4)

(8)计算当前日期是一年的第几天。
select DATENAME(DAYOFYEAR,GETDATE())

运行结果:
(9)计算当前日期是一周中的第几个工作日。
select DATENAME(WEEKDAY,GETDATE())

(10)计算“1929-02-14”与当前日期之间相差的年份。
SELECT DATEDIFF(YEAR,'1929-02-14',GETDATE())

*(11)显示到当前日期和时间为止试图登录SQL Server的次数。
SELECT GETDATE() AS 当前日期和时间,@@CONNECTIONS as 试图登录SQLServer的次数

注:*为思考题,需查阅资料
第二部分:
7.3 创建触发器
对数据库Company中的Employees表的插入操作创建触发器:如果插入的性别esex为“女”时,则基本工资增加100元。
Sqlserver 数据中:
CREATE TRIGGER trigger_name ON Employees
FOR INSERT
as
declare e cursor for select staffid,esex from inserted
declare @staffid char(9)
declare @esex CHAR(2)
OPEN e
fetch NEXT FROM e into @staffid,@esex
WHILE @@FETCH_STATUS=0
BEGIN
IF @esex = '女'
update Employees set Salary=Salary+100 where @staffid=staffid
fetch next from e into @staffid,@esex
end
close e
DEALLOCATE e
插入的数据:
INSERT INTO Department VALUES(1,'支部委员会','党的基层委员会')
INSERT INTO Employees VALUES(1,1143,'罗兆','男','1995-12-06','未婚',1,'支部副书记',3000)
INSERT INTO Employees VALUES(2,1142,'刘艳','女','1995-12-06','未婚',1,'支部书记',3000)
执行效果:

7.4 创建存储过程
创建一个添加职员记录的存储过程。
use Company
go
create proc addEmp
(
@staffid char(9),
@idcard smallint,
@realname varchar(20),
@esex CHAR(2),
@birthday DATE,
@marriage CHAR(4),
@departmentID smallint,
@Position CHAR(10),
@Salary SMALLMONEY
)
AS
BEIGN
insert into Employees
values(@staffid ,
@idcard ,
@realname ,
@esex ,
@birthday ,
@marriage ,
@departmentID ,
@Position ,
@Salary )
7.5 调用存储过程
调用7.4所创建的存储过程。
exec addEmp 3,1141,'朱超','男','1995-12-06','未婚',1,'团组织书记',3000

扩展题:
7.6 编写触发器,当Employees中的基本工资修改后,往特定的表中插入记录(自行定义表),要求插入的内容至少包括,修改的操作用户、修改的时间等。
创建一个UptadeJilu,用来记录修改EMp表中薪资修改记录的表
Create table UptadeJilu
(
UserName varchar(30),
idTime DateTime,
)
创建一个触发器用来触发当,薪资变化后,UptadeJilu同时记录修改时间,和修改者
CREATE TRIGGER Salary_tri_Emp ON Employees
FOR UPDATE
as
if update(Salary)
BEGIN
insert into UptadeJilu values(system_user,GETDATE())
end

7.7 编写存储过程,假设Employees表中的职别Position包括总经理、部门经理、办事员,现请编写存储过程根据级别分别增加30%、20%、10%的工资。
CREATE TRIGGER Position_Emp_Salary ON Employees
FOR INSERT
as
declare e cursor for select staffid,Position from inserted
declare @staffid char(9)
declare @Position CHAR(10)
OPEN e
fetch NEXT FROM e into @staffid,@Position
WHILE @@FETCH_STATUS=0
BEGIN
IF @Position = '总经理'
update Employees set Salary=Salary*1.3 where @staffid=staffid
IF @Position = '部门经理'
update Employees set Salary=Salary*1.2 where @staffid=staffid
IF @Position = '办事员'
update Employees set Salary=Salary*1.1 where @staffid=staffid
fetch next from e into @staffid,@Position
end
close e
DEALLOCATE e
INSERT INTO Employees VALUES(5,1121,'张帅1','男','1995-12-06','未婚',1,'总经理',3000)
INSERT INTO Employees VALUES(6,1120,'张帅2','男','1995-12-06','未婚',1,'部门经理',3000)
INSERT INTO Employees VALUES(7,11219,'张帅3','男','1995-12-06','未婚',1,'办事员',3000)
select * from Employees
