声明游标
3.5.1 声明游标
【例3.34】 声明游标的简单例子。
/* 下列声明的游标默认为FORWARD_ONLY游标 */
DECLARE E1cursor cursor
FOR SELECT *
FROM c_example
/* 下列声明的游标为STATIC游标且默认为SCROLL */
DECLARE E2cursor cursor
STATIC
FOR SELECT *
FROM c_example
在T-SQL,使用DECLARE CURSOR语句来声明游标。DECLARE CURSOR语句既可接受基于SQL-92标准的语法,也可接受使用T-SQL扩展的语法。
DECLARE CURSOR语句SQL-92标准语法格式:
DECLARE 游标名 [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select语句
[ FOR { READ ONLY | UPDATE [ OF 列名 [,…] ] } ]
DECLARE CURSOR语句T-SQL扩展语法格式:
DECLARE 游标名CURSOR
[ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select语句
[ FOR UPDATE [ OF 列名 [,…] ] ]
DYNAMIC 指定游标为‘动态’游标。动态游标能够反映出结果集内的行所做的所有数据更改。行的数据值、顺序和成员在每次提取时都会更改。动态游标不支持 ABSOLUTE 提取选项。由于使用动态游标时记录会不断地被更新,所以用户能够立刻看到别人对记录所作的修改。这种游标是最灵活的,但同时也耗用最大的系统开销和资源。
FAST_FORWARD 指定启用性能优化的FORWARD_ONLY,READ_ONLY游标。如果指定了 FAST_FORWARD,则不能也指定SCROLL或FOR_UPDATE。 FAST_FORWARD和FORWARD_ONLY是互斥的,如果指定了其中一个,则不能指定另一个。
READ_ONLY 禁止通过该游标进行更新。在UPDATE或DELETE语句的WHERE CURRENT OF 子句中不能引用游标。该选项替代要更新的游标的默认功能。
SCROLL_LOCKS 指定确保通过游标完成的定位更新或定位删除可以成功。当将行读入游标以确保它们可用于以后的修改时, SQL Server会锁定这些行。如果指定了 FAST_FORWARD,则不能指定 SCROLL_LOCKS。
OPTIMISTIC 指定该选项的作用是: 如果行自从被读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功。当将行读入游标时SQL Server不锁定行,SQL Server会使用timestamp列值的比较,或者如果表中没有timestamp列则使用校验值,以确定将行读入游标后是否已修改该行。如果已修改该行,尝试进行的定位更新或定位删除将失败。如果还指定了FAST_FORWARD,则不能指定OPTIMISTIC。
TYPE_WARNING 指定该选项后,如果游标从所请求的类型隐性转换为另一种类型,则给客户端发送警告消息。
select语句 定义游标结果集的标准select语句。在游标声明的select语句内不允许使用COMPUTE,COMPUTE…BY,FOR BROWSE和INTO等关键字。如果select语句内的子句与所请求的游标类型冲突,SQL Server将游标隐性转换成另一种类型。
UPDATE [OF 列名 [,…]] 定义游标内可更新的列。如果给出了“OF 列名 [,…]”,则只允许修改列出的列。如果在UPDATE中未指定列的列表,除非也指定了READ_ONLY选项,否则所有列均可更新。
declare @dbname varchar(50)
declare my_cursor cursor for
select name into dbname from master..sysdatabases where name='gateloghb'--name like 'gatelog%'
open my_cursor
fetch next from my_cursor into @dbname
while @@fetch_status = 0
begin
declare @filename varchar(50)
exec('use '+@dbname)
???????????????????????
declare my_cursor1 cursor for
exec('select name from '+@dbname+'.dbo.sysobjects
where xtype=''u'' and name like ''bak_mo_200%''or name like ''bak_mt_200%'' or name like ''bak_smc_200%'' or name like ''bak_rpt_200%'' ')
?????????????????????
open my_cursor1
fetch next from my_cursor1 into @filename
while @@fetch_status = 0
begin
if (cast(right(@filename,6) as int)-200405)<=0
exec ('drop table gateloghb.dbo.'+@filename)
print(@filename)
fetch next from my_cursor1 into @filename
end
close my_cursor1
deallocate my_cursor1
fetch next from my_cursor into @dbname
end
close my_cursor
deallocate my_cursor
http://www2.scut.edu.cn/achievement/15/kj/database/zbb/db3_5_1.htm
给游标用动态sql语句,可是游标不支持,我怎么才让他可以支持呢!!!!!!!!
问号之间是问题所在!!!
不行先定个临时表,将exec后的结果存起来,再用游标调用。
declare @dbname varchar(50)
declare @s_sql varchar(500)
declare my_cursor cursor for
select name
from master..sysdatabases
where name='gateloghb'--name like 'gatelog%'
open my_cursor
fetch next from my_cursor into @dbname
while @@fetch_status = 0
begin
declare @filename varchar(50)
exec('use '+@dbname)
set @s_sql = 'declare my_cursor1 cursor for
select name from ' + @dbname + '.dbo.sysobjects
where xtype=''u'' and name like ''bak_mo_200%''or name like ''bak_mt_200%'' or name like ''bak_smc_200%'' or name like ''bak_rpt_200%'' '
exec(@s_sql)
open my_cursor1
fetch next from my_cursor1 into @filename
while @@fetch_status = 0
begin
if(cast(right(@filename,6) as int)-200405)<=0
exec ('drop table gateloghb.dbo.'+@filename)
print(@filename)
fetch next from my_cursor1 into @filename
end
close my_cursor1
deallocate my_cursor1
fetch next from my_cursor into @dbname
end
close my_cursor
deallocate my_cursor
游标可以嵌套吗?那◎◎fetch_status 保留的是什么时候的状态呢?
游标可以嵌套,只要记得在不需要它时加上
close my_cursor1
deallocate my_cursor1
@@fetch_status 有三种状态
0 FETCH 语句成功。
-1 FETCH 语句失败或此行不在结果集中。
-2 被提取的行不存在。