⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 在线考试系统.sql

📁 这是个在线考试系统
💻 SQL
字号:
CREATE DATABASE 在线考试系统
ON PRIMARY
(NAME =examol_dat,
   FILENAME ='e:\mssql\data\examoll.mdf',
   SIZE = 10,
   MAXSIZE =50,
   FILEGROWTH =5)
LOG ON 
(NAME=examol_log,
   FILENAME ='e:\mssql\log\examoll.ldf',
   SIZE = 10MB,
   MAXSIZE =25MB,
   FILEGROWTH =5MB) 

use 在线考试系统

CREATE TABLE 考生信息表(
    考生号 CHAR(8) NOT NULL PRIMARY KEY CHECK(ISNUMERIC(考生号)=1),
    姓名 CHAR(10),
    班级 VARCHAR(8) CHECK(ISNUMERIC(班级)=1),
    系别 VARCHAR(10),
    分数 FLOAT NULL )

CREATE TABLE 题库表1(
    出题时间 DATETIME,
    考试时间 DATETIME,
    题库号 int,
    科目 varchar(10)primary key,
    题号 INT CHECK(ISNUMERIC(题号)=1),
    题型 CHAR(10),
    题目 VARCHAR(100) NOT NULL,
    此题分数 FLOAT CHECK(ISNUMERIC(此题分数)=1), 
    正确答案 CHAR(10))

CREATE TABLE 题库表2(
    出题时间 DATETIME,
    考试时间 DATETIME,
    题库号 int,
    科目 varchar(10)primary key,
    题号 INT CHECK(ISNUMERIC(题号)=1),
    题型 CHAR(10),
    题目 VARCHAR(100) NOT NULL,
    此题分数 FLOAT CHECK(ISNUMERIC(此题分数)=1), 
    正确答案 CHAR(10))

CREATE TABLE 考试试题表(
    题库号 int,
    科目 varchar(10),
    题号 INT CHECK(ISNUMERIC(题号)=1),
    题型 CHAR(10),
    题目 VARCHAR(100) NOT NULL,
    此题分数 FLOAT CHECK(ISNUMERIC(此题分数)=1),
    考生答案 CHAR(10))


ALTER TABLE 题库表1 ADD 考生答案 CHAR(10)
ALTER TABLE 题库表2 ADD 考生答案 CHAR(10)
ALTER TABLE 考生信息表 ADD 考试总时间 INT
ALTER TABLE 考生信息表 DROP COLUMN 考试总时间  

INSERT INTO 考生信息表(考生号,姓名,班级,系别)values('05112301','ding','051123','软件')
INSERT INTO 考生信息表(考生号,姓名,班级,系别)values('05112302','dong','051123','软件')
INSERT INTO 考生信息表(考生号,姓名,班级,系别)values('05112303','fan','051123','软件')
INSERT INTO 考生信息表(考生号,姓名,班级,系别)values('05112304','hu','051123','软件')
INSERT INTO 考生信息表(考生号,姓名,班级,系别)values('05112305','huang','051123','软件')
INSERT INTO 考生信息表(考生号,姓名,班级,系别)values('05112306','jiang','051123','软件')
INSERT INTO 考生信息表(考生号,姓名,班级,系别)values('05112307','jin','051123','软件')
INSERT INTO 考生信息表(考生号,姓名,班级,系别)values('05112308','li','051123','软件')
INSERT INTO 考生信息表(考生号,姓名,班级,系别)values('05112320','zhang','051123','软件')

create view v_s1 as
select  考生号,姓名,班级,系别,分数
from 考生信息表
select *
from v_s1

create view v_s2 as
select  科目,题号,题型,题目,此题分数,正确答案
from 题库表1
select *
from v_s2

create view v_s3 as
select  科目,题号,题型,题目,此题分数,正确答案
from 题库表2
select *
from v_s3

create view v_s4 as
select  科目,题号,题型,题目,此题分数,考生答案
from 考试试题表
select *
from v_s4


create trigger NEWSTUDENT
on 考生信息表
for insert 
as print'插入一个考生信息!'

insert into 考生信息表(考生号,姓名,班级,系别)values('05112313','din','051123','软件')

create trigger NEWSUBJECT1
on 题库表1
for insert 
as print'插入一个新题目!'

create trigger NEWSUBJECT2
on 题库表2
for insert 
as print'插入一个新题目!'

create trigger 考生号管理
on 考生信息表 for insert
as 
if not exists(select*from 考生信息表 where 考生号=(select 考生号 from inserted))
begin
  raiserror('不能重复学号!',1,1)
  rollback transaction
end

create trigger 题号管理1
on 题库表1 for insert
as 
if not exists(select*from 题库信息 where 题号=(select 题号 from inserted))
begin
  raiserror('不能重复题号!',1,1)
  rollback transaction
end

create trigger 题号管理2
on 题库表2 for insert
as 
if not exists(select*from 题库信息 where 题号=(select 题号 from inserted))
begin
  raiserror('不能重复题号!',1,1)
  rollback transaction
end



/*------------------------------------------------------------------------------------*/

CREATE PROCedure 考生信息核对_登陆;1
(@number int=null)
as
IF @number IS NULL
BEGIN
   PRINT'您必须填写考生号,否则无法进入在线考试系统!'
   RETURN 13
END
IF NOT EXISTS(SELECT * FROM 考生信息表 WHERE 考生号=@number)
BEGIN
   PRINT'无此考生!'
   RETURN -103
END
IF EXISTS (SELECT * FROM 考生信息表 WHERE 考生号=@number)
BEGIN
   PRINT'顺利进入在线考试系统!' 
END

execute 考生信息核对_登陆;1 05112316

execute 考生信息核对_登陆;1 05112320
/*--------------------------------------------------------------------------------*/
create procedure 选择科目;1
(@sub varchar(10)=null)
as
if @sub=null
begin
print '请输入您要考试的科目!'
return 13
end
if not exists (select * from 题库1  
				where 科目=@sub)
begin
print'请输入正确的考试科目!'
return -103
end
update  考试试题表 set 科目=(@sub)
execute 试题发配 @sub

begin
print '选择成功...现在开始考试!'
select top 1 题号,科目,题型,题目 from 考试试题表 where 考生答案 is null  order by 题型,题号
return 14
end
return 0
/*----------------------------------------------------------------------------------*/
create procedure 试题发配;1
(@sub2 varchar(10)=null)
as
declare @i int,@j int,@k int
set @k=1
set @i=1
while(@i<=15)
begin
set @j=(select top 1 题号 from 题库1 
		where 科目=@sub2 
		order by newid())
if  not exists (select*from 考试试题表 where 题号=@j  )
begin
insert into 考试试题表(题库号,题号,科目,题型,题目,此题分数,考生答案)
 select 题库号,题号,科目,题型,题目,此题分数,考生答案  from 题库1 where 题号=@j
update 考试试题表 
set 题库号 =@k
set @i=@i+1
end
else
continue
end

declare @m int,@n int
set @m=1

while(@m<=15)
begin
set @n=(select top 1 试题号 from 题库2 
			where 科目=@sub2 
			order by newid())
if  not exists (select*from 考试试题表 where 题号=@n  )
begin
insert into 考试试题表(题库号,题号,科目,题型,题目,此题分数,考生答案)
 select 题库号,题号,科目,题型,题目,此题分数,考生答案  from 题库2  where   题号=@n
update 考试试题表 
set 题库号 =@k
set @m=@m+1
end
else
continue
end
set @k=@k+1
return 0

/*---------------------------------------------------------------------------------*/

CREATE PROCedure 考生信息;1
AS
IF EXISTS(SELECT * FROM 考生信息表 WHERE 考生号='05112320')
BEGIN 
PRINT '该考生已经进入考试系统,不能退出再次进入系统!'
RETURN 13
END

execute 考生信息;1 

/*------------------------------------------------------------------------------------*/

CREATE PROCedure 考试时间管理;1
(@timer1 DATETIME=NULL,@timer2 DATETIME=NULL)
AS
IF EXISTS(SELECT * FROM 考生信息表 WHERE 考试总时间<= DATEDIFF(HOUR,@timer1,@timer2))
BEGIN
PRINT'时间已经到了,必须交卷。不能再做啦!'
RETURN -103
END

execute 考试时间管理;1 '10:00:00.000','12:00:00.000 '

/*------------------------------------------------------------------------------------*/
CREATE PROCedure 考卷管理;1
AS
IF EXISTS(SELECT * FROM 考试试题表)
BEGIN
PRINT '该考生已经得到考卷,不能重发!'
RETURN 13
END
PRINT '打开考试试题,可以开始答卷啦!'
execute 考卷管理;1

/*------------------------------------------------------------------------------------*/
create procedure 答题要求;1
 as 
if exists ( select* from  考试试题表 where 考生答案 != 'A' or 考生答案 != 'B'or 考生答案 != 'C' or 考生答案 != 'D' )
begin
  raiserror('请重新选择ABCD之一',1,1)
  
end
execute 答题要求;1
/*--------------------------------------------------------------------------------*/
create procedure 答题;1
(@ans varchar(5)=null)
as 
begin
update 试卷
set 考生作答答案=@ans
where 题号=(select top 1 题号 from 考试试题表 where 考生答案 is null  order by 题型,题号)
select 题号,科目,题型,题目,考生答案 from 考试试题表 where 考生答案 is not null order by 题型,题号
select top 1 题号,科目,题型,题目 from 考试试题表  where 考生答案 is null order by 题型,题号
end
return 0 
/*---------------------------------------------------------------------------------*/
CREATE PROCedure 评分系统;1
AS
DECLARE @i INT,@totalmarks INT
SELECT @i=1
SELECT @totalmarks=0
WHILE(@i<=100)
BEGIN
IF EXISTS(SELECT * FROM 考试试题表 WHERE 题号=@i)
BEGIN 
IF EXISTS(SELECT * FROM 题库信息表 WHERE 题号=@i and 正确答案 IN(SELECT 考生答案 FROM 考试试题表 WHERE 题号=@i))
BEGIN
SELECT @totalmarks=@totalmarks+2
END
end
SELECT @i=@i+1
END
PRINT'此学生的总分为:'
PRINT @totalmarks
UPDATE 考生信息表
SET 分数=@totalmarks
WHERE 考生号='05112301'
SELECT * FROM 考生信息表

execute 评分系统;1


--备份整个数据库
create PROCEDURE 在线考试系统back_up;1
as
backup database 在线考试系统
to disk='e:\mssql\db在线考试.bak'



--增量备份
backup database 在线考试系统
to disk='e:\mssql\add_db在线考试.bak'
with differential

execute  在线考试系统back_up;1


--恢复数据库,存储过程
create PROCEDURE db_recovery;1
as

--全备份的恢复
restore database 在线考试系统
from disk='e:\mssql\db在线考试.bak'
with norecovery


--增量备份恢复
restore database 在线考试系统
from disk='e:\mssql\add_db在线考试.bak'
with norecovery

execute db_recovery;1

   
/*-------------------------------------------------------------------------------------------*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -