use student2 go
alter table 学生成绩表 drop constraint con_ num go
6. 利用存储过程sp_help查看3个表的信息,代码如下:
exec sp_help 基本表;exec sp_help 课程信息表;exec sp_help 学生成绩表。
7. 如何在一张表创建之后通过T-SQL语句定义主键约束?以基本表为例,代码如下:
use stuinfo go
alter table 基本表
add constraint pk_num primary key(学号)
实验六
1、 use student go
create view y_view as
select s_name,sex,polity,score,c_number from t_student,t_score
where t_student.s_number=t_score.s_number 2、 use student go
create view v_1 as select * from t_student
where polity='团员' and sex='男' 3、 use student go
create view v_2 as select * from t_student
where polity='团员' and sex='女'
16
with check option
实验七
1、在查询分析器中书写T-SQL语句创建和执行存储过程 (1)创建和执行存储过程Proc_score。
USE STUINFO GO
--创建存储过程Proc_score CREATE PROC Proc_score
WITH RECOMPILE,ENCRYPTION AS
SELECT S_number,score FROM t_score
WHERE C_number='2' --执行存储过程Proc_score EXEC Proc_score
(2)创建和执行带输入参数的存储过程Proc_list
USE STUINFO GO
--创建存储过程Proc_list CREATE PROC Proc_list @cno char(4) AS
SELECT TOP 5 WITH TIES S_number,score FROM t_score
WHERE C_number=@cno
ORDER BY score DESC,S_number ASC
--执行存储过程Proc_list,查询“1”号课程成绩排名前5位的学生成绩记录。 EXEC Proc_list '1' 其中,“1”为要传递给存储过程Proc_list的输入参数。 (3)创建和执行带输入和输出参数的存储过程ProcAvgScore
CREATE PROC ProcAvgScore @cno char(4),
@maxscore real OUTPUT, @minscore real OUTPUT,
@avgscore numeric(5,2) OUTPUT AS
SELECT @maxscore=MAX(score),@minscore=MIN(score)
17
,@avgscore=AVG(score) FROM t_score
WHERE C_number=@cno GROUP BY C_number
/*执行存储过程ProcAvgScore,查询选修“1”号课程学生成绩的最高分,最低分和平均分*/
DECLARE @maxscore real,@minscore real,@avgscore numeric(5,2) EXEC ProcAvgScore '1',@maxscore OUTPUT ,@minscore OUTPUT,@avgscore OUTPUT
PRINT '该门课程成绩最高分为:'+CAST(@maxscore AS char(6)) PRINT '该门课程成绩最高分为:'+CAST(@minscore AS char(6)) PRINT '该门课程成绩最高分为:'+CAST(@avgscore AS char(6)) 2、使用T-SQL语句查看、修改和删除存储过程 (1)查看存储过程
a.查看加密存储过程的定义 EXEC sp_helptext Proc_score
注意观察执行结果。能够查看到该存储过程的定义文本吗? b.查看未加密存储过程的定义 EXEC sp_helptext Proc_list
EXEC sp_helptext ProcAvgScore c.查看有关存储过程的信息。 EXEC sp_help Proc_score EXEC sp_help Proc_list
EXEC sp_help ProcAvgScore (2)修改存储过程Proc_score USE STUINFO GO
ALTER PROC Proc_score WITH RECOMPILE AS
SELECT S_number,score FROM t_score
WHERE C_number='1' (3)删除上述创建的存储过程
DROP PROC Proc_score,Proc_list,ProcAvgScore 思考与练习:
1、USE STUINFO
GO
18
CREATE PROC insert_tri @Cnum Char (4), @Cname char (16),
@Teacher char (10) =NULL, @Hours int,
@Credit int =NULL AS
IF @Cnum IS NULL OR @Cname IS NULL OR @Hours IS NULL BEGIN
PRINT '你必须提供课程号,课程名,课程学时!' PRINT '(授课教师,学分可以为空。)' RETURN END
BEGIN TRANSACTION
INSERT t_course (C_number,C_name, Teacher, Hours, Credit) VALUES (@Cnum,@Cname,@Teacher,@Hours,@Credit) IF @@error <> 0 BEGIN ROLLBACK TRAN RETURN END
PRINT '新课程已经添加' COMMIT TRANSACTION GO
2、USE STUINFO GO
CREATE PROC GetCredit @Sno char(8), @cname char(16),
@score real OUTPUT, @GetCredit int OUTPUT AS
SELECT @score =score, @GetCredit =CASE WHEN score <60 THEN 0 ELSE Credit END
FROM t_course JOIN t_score ON t_course.C_number=t_score.C_number WHERE t_score.S_number=@Sno AND C_name=@cname --执行存储过程
19
DECLARE @score real,@GetCredit int
EXEC GetCredit '2004001','SQL Server程序设计', @score OUTPUT,@GetCredit
OUTPUT
PRINT '成绩='+CONVERT(varchar(6),@score)+' ,所获学分='+CONVERT
(char(2), @GetCredit)
实验八 思考与练习
1、USE STUINFO
GO
CREATE TRIGGER Score_update2 ON t_course FOR UPDATE AS
IF UPDATE(credit) BEGIN
RAISERROR('禁止用户修改credit列!',10,1) ROLLBACK TRANSACTION END
2、USE STUINFO
GO
CREATE TRIGGER Delete_score ON t_course FOR DELETE AS BEGIN
DELETE t_score FROM t_score, deleted
WHERE t_score.C_number=deleted.C_number END
3、USE STUINFO
GO
CREATE TRIGGER tri_insert ON t_score FOR INSERT AS BEGIN
DECLARE @credit int,@score real SELECT @score=score FROM inserted
20