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][]以后,如果原始基表中的数据在以后的游标处理中发生了变化,它们对游标是不可见的。这种不敏感游标不允许数据更改。
scroll关键字表示光标可以向任何方向滚动。的所有提取选项(first、last、next、relative、absolute)都可以在游标中使用。如果忽略此选项,光标只能向前滚动(下一步)。
Select_statement表示由SQL语句建立的结果集。在游标声明的select语句中,不允许使用Transact SQL语句COMPUTE、COMPUTE BY、FOR BROWSE和INTO。
READ ONLY表示不允许在游标结果集中修改数据。
update关键字表示可以修改游标的结果集。
OF column_list指示结果集中可以修改的列。默认情况下(使用UPDATE关键字),可以修改所有列。
local关键字表示光标是本地的,并且只能在声明的过程中使用。
global关键字使光标对整个连接全局可见。当连接激活时,的全局光标随时可用。只有当连接结束时,光标才不再可用。
FORWARD_ONLY表示光标只能向前滚动。
static的游标和INSENSITIVE的游标一样。
KEYSET表示所选行的顺序。SQL Server将从结果集中创建一个临时关键字集。如果数据库的非键列被修改,它们对光标可见。因为是固定的一组关键字,所以修改或插入新的关键字列是不可见的。
DYNAMIC表示游标将反映对结果集的所有修改。
SCROLL_LOCK锁定修改或删除,以确保游标操作成功。
Optimal指示游标所做的哪些修改或删除不会成功。
注意:
如果在SELECT语句中使用DISTINCT、UNION和GROUP BY语句,并且选择中包含聚合表达式,则该游标将自动成为不敏感游标。
…如果基表没有索引,游标将被创建为不敏感游标。
...如果SELECT语句包含ORDER BY,并且由ORDER BY标记的列不是行ID,则动态游标将被转换为键集游标。如果键集游标无法打开,它将被转换为不敏感游标。用SQL ANSI-92语法定义的游标也是如此,只是没有INSENSITIVE关键字。
二。打开游标
打开游标以创建结果集。它是由cursor 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][,...n]]
Next表示该值取自当前行的下一行。
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_status设置为0。@@fetch_status -1表示已经到达结果集的一部分(例如,打开游标后,删除基表中的行)。@@fetch_status可用于构造游标处理的循环。
例如:
declare @ inamechar (20),@ fname char(20)
open author _ cur
fetch first from author _ curinto @ iname,@ fname
WHILE @ @ fetch _ status = 0
BEGIN
IF @ fname = ' Albert '
PRINT " Found Albert Ringer "
ELSE
PRINT " other Ringer "
fetch next from author _ curclose cursor
close语句用于关闭游标并释放结果集。游标关闭后,无法再执行提取操作。如果您仍然需要使用FETCH语句,您必须重新打开游标。语法如下:
Close[global]cursor _ name | cursor _ variable _ name
v . Release cursor
不再需要时释放游标。DEALLOCATE语句释放由数据结构和游标添加的锁。语法如下:
deallocate[global]cursor _ name | cursor _ variable _ name

以下是游标的完整示例:
USE MASTER
GO
CREATE PROCEDURE SP _ BUILD INDEX
AS
DECLARE @ tablename sysname,@ msgvarchar (100),@ cmd varchar (100)

将table_cur游标声明为
SELECT name FROM sys objects WHERE type = ' u '

OPEN table _ cur[/Br/]FETCH NEXT FROM table _ cur INTO @ TableName[/Br/][/Br/]WHILE @ @ FETCH _ status = 0[/Br/]BEGIN[/Br/]IF @ @ FETCH _ status =-2[/Br/]CONTINUE[/Br/]SELECT @ msg = "为表建立索引"+@ TableName+"……"[/Br/]PRINT @ msg[/Br/]SELECT @ cmd = " DBCC DBREINDEX(" "+@ TableName+" ')"[/Br/]

使用临时表
临时表是在TempDB中创建的表。临时表的名称都以“#”开头。临时表的作用域是创建到临时表的连接。因为临时表不能在两个连接之间共享,所以一旦连接关闭,临时表将被丢弃。如果临时表是在存储过程中创建的,则临时表的范围是在存储过程或存储过程调用的任何存储过程中。如果需要在连接之间共享临时表,就需要使用全局临时表。的全局临时表以符号“# #”开头,并将存在于数据库中,直到SQL Server重新启动。一旦创建了这个临时表,所有用户都可以访问它。无法在临时表上明确表示权限。临时表提供了存储中间结果的能力。有时,临时表可以通过将一个复杂的查询分成两个查询来提高性能。这可以通过首先将第一次查询的结果存储在一个临时表中,然后在第二次查询中使用该临时表来实现。当在就座过程中多次使用大桌子的子集时,建议使用临时桌子。在这种情况下,数据的一个子集保存在临时表中,以便在后续连接中使用,这可以大大提高性能。还可以在临时表中创建索引。

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

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情