(2) 动态游标 (3) 只进游标
(4) 由键集驱动游标
根据T-SQL服务器游标在结果集中移动方式,SQL Server 2005将游标分为两种: (1) 滚动游标 (2) 前向游标
根据T-SQL服务器游标结果集是否允许修改,SQL Server 2005将游标分为两种: (1) 只读游标 (2) 只写游标
9. 创建游标可以用哪两种方式?这两种方式创建的游标一样吗?创建完游标是否可以马上读取数据?
答:声明游标有两种方式:标准方式和T-SQL扩展方式。这两种方式创建的游标不一样。创建完游标是不可以马上读取数据,还必须打开游标。
10. 利用标准方式声明一个游标,查询课程表中的课程编号和课程名信息,并读取数据。 答:DECLARE 课程 CURSOR
FOR
SELECT 课程号,课程名 FROM 课程表 GO
OPEN 课程 GO
FETCH NEXT FROM 课程 GO
11. 利用T-SQL扩展方式声明一个游标,查询学生表中的学号、姓名、性别和出生日期信息,并读取数据。要求:
(1) 读取最后一条记录。FETCH LAST FROM 学生 (2) 读取第一条记录。FETCH FIRST FROM 学生
(3) 读取第4条记录。FETCH ABSOLUTE 4 FROM 学生
(4) 读取当前记录指针位置后第2条记录。FETCH RELATIVE 2 FROM 学生 (5) 读取当前记录指针位置前第2条记录。FETCH RELATIVE -2 FROM 学生 答:
DECLARE 学生 CURSOR DYNAMIC FOR
SELECT 学号,姓名,性别,出生日期 FROM 学生表 GO
OPEN 学生 GO
21
FETCH LAST FROM 学生 FETCH FIRST FROM 学生
FETCH ABSOLUTE 4 FROM 学生 FETCH RELATIVE 2 FROM 学生 FETCH RELATIVE -2 FROM 学生 GO
补充1、编写一个程序,采用游标方式输出所有课程的平均分。 USE xscj GO
--声明变量
DECLARE @c_name varchar(8),@s_avg float --声明游标
DECLARE st_cursor CURSOR
FOR SELECT 课程表.课程名,AVG(成绩表.分数) FROM 课程表,成绩表
WHERE 课程表.课程号=成绩表.课程号 AND 成绩表.分数 IS NOT NULL GROUP BY 课程表.课程名 --打开游标
OPEN st_cursor --提取第一行数据
FETCH NEXT FROM st_cursor INTO @c_name,@s_avg --打印表标题
PRINT '课程 平均分' PRINT '-----------------'
WHILE @@FETCH_STATUS = 0 BEGIN
--打印一行数据
PRINT @c_name+' '+CAST(@s_avg AS char(10)) --提取下一行数据
FETCH NEXT FROM st_cursor INTO @c_name,@s_avg END
--关闭游标
CLOSE st_cursor --释放游标
DEALLOCATE st_cursor GO
补充2、编写一个程序,采用游标方式输出所有学号、课程号和成绩等级。 USE xscj GO 22
--声明变量
DECLARE @no1 char(5),@no2 char(6),@fs char(2) --声明游标
DECLARE fs_cursor CURSOR FOR SELECT 学号,课程号, CASE
WHEN 分数>=90 THEN 'A' WHEN 分数>=80 THEN 'B' WHEN 分数>=70 THEN 'C' WHEN 分数>=60 THEN 'D' WHEN 分数<60 THEN 'E' END
FROM 成绩表 WHERE 分数 IS NOT NULL ORDER BY 学号 --打开游标
OPEN fs_cursor --提取第一行数据
FETCH NEXT FROM fs_cursor INTO @no1,@no2,@fs --打印表标题
PRINT '学号 课程号 等级' PRINT '-----------------'
WHILE @@FETCH_STATUS = 0 BEGIN
--打印一行数据
PRINT @no1+' '+@no2+' '+@fs --提取下一行数据
FETCH NEXT FROM fs_cursor INTO @no1,@no2,@fs END
--关闭游标
CLOSE fs_cursor --释放游标
DEALLOCATE fs_cursor GO
10.3 习题
1. 存储过程和触发器的作用是什么?使用它们有什么好处
答:存储过程(Stored Procedure)是一组完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行存
23
储过程。
触发器是一种特殊类型的存储过程,它不同于前面介绍过的存储过程,主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。
使用存储过程和触发器可以提高系统查询效率,增强数据的完整性。 2. SQL Server 2005中存储过程的类型有哪些?
答:在SQL Server 2005中存储过程分为三类:系统提供的存储过程、用户自定义存储过程和扩展存储过程。
3. 在有些情况下,为什么需要重新编译存储过程?
答:在执行诸如添加索引或更改索引列中的数据等操作更改了数据库时,应重新编译访问数据库表的原始查询计划以对其重新优化。在SQL Server 2005重新启动后,第一次运行存储过程时自动执行此优化。当存储过程使用的基础表发生变化时,也会自动执行此优化。但如果添加了存储过程可能从中受益的新索引,将不会自动执行优化,直到下一次SQL Server重新启动并再运行该存储过程时为止。在这种情况下,强制在下次执行存储过程时对其重新编译会很有用。
4. SQL Server 2005中触发器的类别有哪些?
答:SQL Server 包括两大类触发器:DML触发器和DDL触发器。 5. 创建存储过程和触发器的SQL语句是什么? 答:创建存储过程:
CREATE PROCEDURE [schema_name.] procedure_name [ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ OUT | OUTPUT ] ] [ ,...n ] [ WITH ENCRYPTION ] AS {
CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view }
[ WITH
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS { sql_statement [ ; ] [ ...n ] | EXTERNAL NAME
补充:1、创建一个AFTER触发器,要求实现以下功能:在成绩表上创建一个插入、更新类型的触发器TR_ScoreCheck,当在成绩表字段中插入或修改考试分数后,触发该触发器,检查分数是否在0-100之间。
USE XSCJ GO
CREATE TRIGGER TR_ScoreCheck ON 成绩表 24
相关推荐: