DECLARE 游标名称 CURSOR FOR SELECT 字段1,字段2,字段3,... FROM 表名 WHERE ... OPEN 游标名称 FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,... WHILE @@FETCH_STATUS=0 BEGIN SQL语句执行过程... ... FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,... END CLOSE 游标名称 DEALLOCATE 游标名称
DECLARE @id INT //用于临时存储ID DECLARE @name NVARCHAR(10) //用于临时存储名字
DECLARE cursor1 CURSOR FOR SELECT Name ID FROM Students WHERE LENGTH(Name) = 2 //选出想要操作的数据,在这里是找出名字长度为2的数据 OPEN cursor1 //打开游标 FETCH NEXT FROM cursor1 INTO @name,@id //将游标所在位置的Name和ID赋值到@name和ID以便操作 WHILE @@FETCH_STATUS = 0 //成功取到数据,即游标还没到头 BEGIN UPDATE Student SET Name = SUBSTRING(@name, 0, 1) + ' ' + SUBSTRING(@name, 1, 1) WHERE ID = @id //名字中间加空格 FETCH NEXT FROM cursor1 INTO @name,@id //游标下移一条数据,再次将Name和ID赋值到@name和ID END CLOSE cursor1 //关闭游标 DEALLOCATE cursor1 //删除游标
例 2
表结构仍和例 1 一样,但现在需求变了:现有的数据都是按 ID 依次递增,并且这些 ID 是根据班级来划分的,比如 ID 1-50 为 1 班,51-100 为 2 班。但是某天 1 班来了个插班生,需要将其 ID 设为 51,2 班的所有 ID 依次加 1。当然这里 ID 不是自增主键,否则就不能更改了。仍按一般格式来做,详细介绍见注释。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
DECLARE @newName NVARCHAR(10) //插班生的名字,假设已经赋值 DECLARE @id INT //用于临时存储ID
DECLARE cursor1 CURSOR FOR SELECT ID FROM Students WHERE ID > 50 ORDER BY ID DESC //这里需要从大到小排序,防止更改ID时有重复 OPEN cursor1 //打开游标 FETCH NEXT FROM cursor1 INTO @id //初始化游标 WHILE @@FETCH_STATUS=0 //成功取到数据,即游标还没到头 BEGIN UPDATE Students SET ID = ID + 1 WHERE ID = @id FETCH NEXT FROM cursor1 INTO @id //游标下移一条数据,再次将ID赋值到@id END CLOSE 游标名称 DEALLOCATE 游标名称