<b>SQL Server 7.0 入门(七)</b>[MSSQL防范]
本文“<b>SQL Server 7.0 入门(七)</b>[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
i. 声明游标
在这一步中,需求指定游标的属性和按照要求产生的后果集.有两种办法可以指定一个游标.
情势1 (ANSI 92)
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE ][OF column_list]}]
情势2
DECLARE cursor_name CURSOR
[LOCAL | GLOBAL]
[FORWARD_ONLY | SCROLL]
[STATIC | KEYSET | DYNAMIC]
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
FOR select_statement
[FOR {READ ONLY | UPDATE ][OF column_list]}]
INSENSITIVE关键字指明要为检索到的后果集成立一个暂时拷贝,今后的数据从这个暂时拷贝中获得.假如在后来游标处理的历程中,原有基表中数据发生了改变,那么它们关于该游标而言是不可见的.这种不敏感的游标不答应数据更改.
SCROLL关键字指明游标可以在肆意方向上转动.全部的fetch选项(first、last、next、relative、absolute)都可以在游标中利用.假如忽视该选项,则游标只能向前转动(next).
Select_statement指明SQL语句成立的后果集.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是为了保证游标操作的成功,而对改正或删除加锁.
OPTIMISTIC指明哪些通过游标举行的改正大概删除将不会成功.
注意:
· 假如在SELECT语句中利用了DISTINCT、UNION、GROUP BY语句,且在挑选中包含了聚合表达式,则游标自动为INSENSITIVE的游标.
· 假如基表没有唯一的索引,则游标成立成INSENSITIVE的游标.
· 假如SELECT语句包含了ORDER BY,而被ORDER BY的列并非唯一的行标识,则DYNAMIC游标将转换成KEYSET游标.假如KEYSET游标不能翻开,则将转换成INSENSITIVE游标.利用SQL ANSI-92语法定义的游标一样如此,只是没有INSENSITIVE关键字罢了.
ii. 翻开游标
翻开游标就是成立后果集.游标通过DECLARE语句定义,但其实际的履行是通过OPEN语句.语法以下:
OPEN { { [GLOBAL] cursor_name } | cursor_variable_name}
GLOBAL指明一个全局游标.
Cursor_name是被翻开的游标的名称.
Cursor_variable_name是所引用游标的变量名.该变量应当为游标范例.
在游标被翻开之后,系统变量@@cursor_rows可以用来检测后果集的行数.@@cursor_rows为负数时,表示游标正在被异步迁移,其绝对值(假如@@cursor_rows为-5,则绝对值为5)为当前后果集的行数.异步游标利用户在游标被完好迁移时仍旧可以拜候游标的后果.
iii. 从游标中取值
在从游标中取值的历程中,可以在后果集合的每一行上往复移动和处理.假如游标定义成了可转动的(在声明时利用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语句中挑选语句所利用的变量数相同.变量的数据范例也应当与被挑选列的数据范例相同.直到下一次利用FETCH语句之前,变量中的值城市一向保持.
每一次FETCH的履行都存储在系统变量@@fetch_status中.假如FETCH成功,则@@fetch_status被设置成0.@@fetch_status为-1表示已经到达了后果集的一部份(比方,在游标被翻开之后,基表中的行被删除).@@fetch_status可以用来构造游标处理的循环.
比方:
DECLARE @iname char(20), @fname char(20)
OPEN author_cur
FETCH FIRST FROM author_cur INTO @iname, @fname
WHILE @@fetch_status = 0
BEGIN
IF @fname = ‘Albert’
PRINT "Found Albert Ringer"
ELSE
Print "Other Ringer"
FETCH NEXT FROM author_cur INTO @iname, @fname
END
iv. 关闭游标
CLOSE语句用来关闭游标并释放后果集.游标关闭之后,不能再履行FETCH操作.假如还需求利用FETCH语句,则要重新翻开游标.语法以下:
CLOSE [GLOBAL] cursor_name | cursor_variable_name
v. 释放游标
游标利用不再需求之后,要释放游标.DEALLOCATE语句释放数据构造和游标所加的锁.语法以下:
DEALLOCATE [GLOBAL] cursor_name | cursor_variable_name
下面给出游标的一个完好的例子:
USE master
GO
CREATE PROCEDURE sp_BuildIndexes
AS
DECLARE @TableName sysname, @msg varchar(100), @cmd varchar(100)
DECLARE table_cur CURSOR 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+"…"
PRINT @msg
SELECT @cmd = "DBCC DBREINDEX (‘"+@TableName+"')"
EXEC (@cmd)
PRINT " "
FETCH NEXT FROM table_cur INTO @TableName
END
DEALLOCATE table_cur
GO
下面的脚本将为PUBS数据库履行sp_BuildIndexes
USE pubs
GO
EXEC ap_BuildIndexes
注意:上面也是成立用户定义的系统存储历程的示例.
利用暂时表
暂时表是在TempDB中成立的表.暂时表的名称都以"#"开首.暂时表的范围为成立暂时表的衔接.因为,暂时表不能在两个衔接之间同享,一旦衔接关闭,暂时表就会被丢弃.假如暂时表被成立于存储历程之中,则暂时表的范围在存储历程之中,大概被该存储历程调用的任何存储历程之中.假如需求在衔接之间同享暂时表,则需求利用全局的暂时表.全局的暂时表以"##"标记开首,它将一向存在于数据库中,直到SQL Server重新启动.一旦这类暂时表成立之后,全部的用户都可以拜候到.在暂时表上不能明确地指明权限. 暂时表供应了存储中间后果的本领.有时刻,暂时表还能通过将一个复杂的查询分化成两个查询而得到性能的改进.这可以通过首先将第一个查询的后果存在暂时表中,然后在第二个查询中利用暂时表来实现.当一个大表中的某个子集在一个在座历程中利用多次时,倡议利用暂时表.在这种情形下,在暂时表中保持数据的子集,以在随后的衔接中利用,这样能大大改进性能.还可以在暂时表中成立索引.
以上是“<b>SQL Server 7.0 入门(七)</b>[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |