简单饿说,游标就是打开一个记录集,进行例遍处理以下是一段游标操作的例程,做了注解,你仔细看看 --定义变量,用来 获取游标的值 DECLARE @au_id varchar(11), @au_fname varchar(20), @au_lname varchar(40), @message varchar(80), @title varchar(80) DECLARE authors_cursor CURSOR FOR SELECT au_id, au_fname, au_lname FROM authors WHERE state = "UT" ORDER BY au_id --定义游标OPEN authors_cursor --打开游标FETCH NEXT FROM authors_cursor INTO @au_id, @au_fname, @au_lname -- 获取游标当前行的值WHILE @@FETCH_STATUS = 0 --例遍游标,获取每行的值 BEGIN
............... --利用游标的值进行数据处理 FETCH NEXT FROM authors_cursor -- 进行下一行的 获取游标的值 INTO @au_id, @au_fname, @au_lname ENDCLOSE authors_cursor --关闭游标 DEALLOCATE authors_cursor --释放游标
查个例子: CREATE TABLE #(id int,a int) INSERT # SELECT 1,1 UNION ALL SELECT 2,2 UNION ALL SELECT 3,2--索引或者约束 --ALTER TABLE # ADD UNIQUE(id) --惟一键(约束),提供RID书签 --CREATE INDEX IDX_a ON #(a) --a列上的普通索引,可以提供RID书签 --CREATE CLUSTERED INDEX IDX_id_1 ON #(id) --id列上的聚集索引,可以提供群集键书签 --CREATE INDEX IDX_id_2 ON #(id) --id列上的普通索引,游标的定义语句无法使用该索引提 供的RID书签 --CREATE INDEX IDX_a_id ON #(a,id) --a列和id列的上普通索引,可以提供RID书签--游标处理 DECLARE tb CURSOR LOCAL FOR SELECT id FROM # ORDER BY a DECLARE @id int OPEN tb FETCH tb INTO @id WHILE @@FETCH_STATUS>=0 BEGIN UPDATE # SET a=a-@id/2 WHERE CURRENT OF tb --Current FETCH tb INTO @id END CLOSE tb DEALLOCATE tb SELECT * FROM # DROP TABLE #
估计楼主是想了解CURRENT OF 的用法以上。。 CREATE INDEX IDX_id_2 ON #(id) 除这个索引外,其它都可以用。。 看注释...
--定义变量,用来 获取游标的值
DECLARE @au_id varchar(11), @au_fname varchar(20), @au_lname varchar(40),
@message varchar(80), @title varchar(80)
DECLARE authors_cursor CURSOR FOR
SELECT au_id, au_fname, au_lname
FROM authors
WHERE state = "UT"
ORDER BY au_id --定义游标OPEN authors_cursor --打开游标FETCH NEXT FROM authors_cursor
INTO @au_id, @au_fname, @au_lname -- 获取游标当前行的值WHILE @@FETCH_STATUS = 0 --例遍游标,获取每行的值
BEGIN
............... --利用游标的值进行数据处理 FETCH NEXT FROM authors_cursor -- 进行下一行的 获取游标的值
INTO @au_id, @au_fname, @au_lname
ENDCLOSE authors_cursor --关闭游标
DEALLOCATE authors_cursor --释放游标
CREATE TABLE #(id int,a int)
INSERT # SELECT 1,1
UNION ALL SELECT 2,2
UNION ALL SELECT 3,2--索引或者约束
--ALTER TABLE # ADD UNIQUE(id) --惟一键(约束),提供RID书签
--CREATE INDEX IDX_a ON #(a) --a列上的普通索引,可以提供RID书签
--CREATE CLUSTERED INDEX IDX_id_1 ON #(id) --id列上的聚集索引,可以提供群集键书签
--CREATE INDEX IDX_id_2 ON #(id) --id列上的普通索引,游标的定义语句无法使用该索引提
供的RID书签
--CREATE INDEX IDX_a_id ON #(a,id) --a列和id列的上普通索引,可以提供RID书签--游标处理
DECLARE tb CURSOR LOCAL
FOR
SELECT id FROM # ORDER BY a
DECLARE @id int
OPEN tb
FETCH tb INTO @id
WHILE @@FETCH_STATUS>=0
BEGIN
UPDATE # SET a=a-@id/2
WHERE CURRENT OF tb --Current
FETCH tb INTO @id
END
CLOSE tb
DEALLOCATE tb
SELECT * FROM #
DROP TABLE #
CREATE INDEX IDX_id_2 ON #(id) 除这个索引外,其它都可以用。。
看注释...
SQL是集合操作,一次操作一组记录。SQL通常比游标快很多,要尽量使用SQL,
实在不行才使用游标。