计算机等级三级数据库SQLServer7.0入门(七)

计算机等级三级数据库SQLServer7.0入门(七),第1张

计算机等级三级数据库SQLServer7.0入门(七),第2张

一、声明游标这一步需要指定游标的属性以及根据需求生成的结果集。有两种方法可以指定光标。
Form 1(ANSI 92)declare cursor _ name[insensitive][scroll]cursor for select _ statement[for { read only | update][of column _ list]}]
Form 2 declare cursor _ name cursor[local | global][forward _ only | scroll][static | keyset | dynamic][read _ only | scroll _ locks | optimal]for select _ statement[for { read only | update][of column _ list]}]
insensitive关键字表示要创建检索结果集的临时副本,并且如果原始基表中的数据在以后的游标处理中发生了变化,它们对游标是不可见的。这种不敏感游标不允许数据更改。
scroll关键字表示光标可以向任何方向滚动。的所有提取选项(first、last、next、relative、absolute)都可以在游标中使用。如果忽略此选项,光标只能向前滚动(下一步)。
Select_statement表示由SQL语句建立的结果集。
在由游标声明的select语句中不允许使用TransactSQL语句COMPUTE、COMPUTE BY、FOR BROWSE和INTO。只读表示不允许在游标结果集中修改数据。
update关键字表示可以修改游标的结果集。Column of _ list指示结果集中可以修改的列。默认情况下(使用UPDATE关键字),可以修改所有列。
local关键字表示光标是本地的,并且只能在声明的过程中使用。GLOBAL关键字使光标对整个连接全局可见。当连接激活时,的全局光标随时可用。只有当连接结束时,光标才不再可用。
FORWARD_ONLY表示光标只能向前滚动。
static的游标和INSENSITIVE的游标一样。键集指示选定行的顺序。
SQL Server将从结果集中创建一个临时关键字集。如果数据库的非键列被修改,它们对光标可见。因为是固定的一组关键字,所以修改或插入新的关键字列是不可见的。指示动态游标将反映对结果集的所有修改。
SCROLL_LOCK用于保证游标操作的成功。Examda提示:相反,它锁定修改或删除。
Optimal指示游标所做的哪些修改或删除不会成功。
注意:如果在SELECT语句中使用了DISTINCT、UNION和GROUP BY语句,并且在选择中包含了聚合表,会不会为false?不敏感光标。
…如果基表没有索引,游标将被创建为不敏感游标。
...如果SELECT语句包含ORDER BY,并且由ORDER BY标记的列不是行ID,则动态游标将被转换为键集游标。如果键集游标无法打开,它将被转换为不敏感游标。用SQL ANSI-92语法定义的游标也是如此,只是没有INSENSITIVE关键字。
二。打开光标。打开游标是为了创建一个结果集。提示:游标是由DECLARE语句定义的,但它的实际执行是由OPEN语句完成的。
语法如下:open { {[global]cursor _ name } | cursor _ variable _ name } global表示全局游标。
Cursor_name是打开的游标的名称。
Cursor_variable_name是被引用游标的变量名。该变量应为游标类型。游标打开后,系统变量@@cursor_rows可用于检测结果集中的行数。
当@@cursor_rows为负时,表示游标正在异步迁移,其绝对值(如果@ @ cursor _ rows为-5,则绝对值为5)是当前结果集中的行数。异步游标使用户能够访问游标的结果,即使它们已完全迁移。
三。在从游标获取值的过程中,可以在结果集中的每一行上来回移动和处理它们。如果游标被定义为可滚动的(声明时使用scroll关键字),则可以随时提取结果集中的任何行。对于非滚动游标,只能对当前行的下一行执行提取操作。结果可以提取到局部变量中。
fetch命令的语法如下:fetch[next | PRIOR | first | last | absolute { n | @ nvar } | relative { n | @ nvar }]from[global]cursor _ name } | cursor _ variable _ name }[into @ variable _ name][
PRIOR表示值取自当前行的上一行。
FIRST是结果集的第一行。
LAST是结果集的最后一行。
ABSOLUTE n表示结果集中的第n行,它也可以通过局部变量传播。行号从0开始,所以当n为0时你得不到任何行。
RELATIVE n表示要提取的行位于当前行的前n行或后n行的位置。如果该值为正,则要提取的行位于当前行的前N行的位置;如果该值为负值,则返回当前行的最后N行。
into @ cursor _ variable _ name表示存储游标列值的变量列表。此列表中的变量数量应该与DECLARE语句中select语句中使用的变量数量相同。变量的数据类型也应该与所选列的数据类型相同。变量中的值将一直保留,直到使用下一个FETCH语句。每次FETCH执行都存储在系统变量@@fetch_status中。
如果FETCH成功,@@fetch_status设置为0。@@fetch_status -1表示已经到达结果集的一部分(例如,打开游标后,删除基表中的行)。
@@fetch_status可用于构造游标处理的循环。
例如:declare @ inamechar (20),@ fname char(20)open author _ cur fetch first from author _ curin to @ iname,@ fname while @ @ fetch _ status = 0 bigif @ fname = ' Albert ' print " found Albert ringer " else print " other ringer " fetch next from author _ curin to @ iname,@ fname end iv .CLOSE cursor Close语句用于关闭游标并释放结果集。游标关闭后,无法再执行提取操作。如果您仍然需要使用FETCH语句,您必须重新打开游标。
语法如下:Close[global]cursor _ name | cursor _ variable _ name
v .释放光标。不再需要光标后,释放光标。DEALLOCATE语句释放由数据结构和游标添加的锁。
语法如下:deallocate[global]cursor _ name | cursor _ variable _ name
下面是一个完整的游标示例:
use master
GO
CREATE PROCEDURE sp _ build indexes
AS
DECLARE @ TableName sysname,@msg varchar(100), @ cmd varchar(100)
declarateable _ cur游标FOR
SELECT name FROM sysobjects WHERE type = ' u '
OPEN table _ cur
FETCH NEXT FROM table _ cur INTO @ TableName
WHILE @ @ FETCH _ status = 0
BEGIN
IF @ @ FETCH _ status =-2
CONTINUE
SELECT @ msg = " Building indexes FOR table "+@ TableName+"…"[] 注意:上面也是创建用户自定义系统存储过程的例子。
使用临时表
临时表是在TempDB中创建的表。临时表的名称都以“#”开头。临时表的作用域是创建到临时表的连接。因为临时表不能在两个连接之间共享,所以一旦连接关闭,临时表将被丢弃。如果临时表是在存储过程中创建的,则临时表的范围是在存储过程或存储过程调用的任何存储过程中。如果需要在连接之间共享临时表,就需要使用全局临时表。的全局临时表以符号“# #”开头,并将存在于数据库中,直到SQL Server重新启动。一旦创建了这种临时表,考试就大了:所有用户都可以访问它。无法在临时表上明确表示权限。
临时表提供存储中间结果的能力。有时,临时表可以通过将一个复杂的查询分成两个查询来提高性能。这可以通过首先将第一次查询的结果存储在一个临时表中,然后在第二次查询中使用该临时表来实现。当在就座过程中多次使用大桌子的子集时,建议使用临时桌子。在这种情况下,数据的一个子集保存在临时表中,以便在后续连接中使用,这可以大大提高性能。还可以在临时表中创建索引。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 计算机等级三级数据库SQLServer7.0入门(七)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情