SQL 游标 Cursor 基本用法

/*
table1结构如下
id    int
name  varchar(50)
*/
declare @id int
declare @name varchar(50)
declare cursor1 cursor for         --定义游标cursor1
select * from table1               --使用游标的对象(跟据需要填入select文)
open cursor1                       --打开游标

fetch next from cursor1 into @id,@name  --将游标向下移1行,获取的数据放入之前定义的变量@id,@name中

while @@fetch_status=0           --判断是否成功获取数据
begin
update table1 set name=name+‘1‘
where id=@id                           --进行相应处理(跟据需要填入SQL文)

fetch next from cursor1 into @id,@name  --将游标向下移1行
end

close cursor1                   --关闭游标
deallocate cursor1

游标一般格式:
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 游标名称 (删除游标)

/*
功能:数据库表格tbl_users数据
deptid userid username
1          100      a
1      101      b
2      102      c
要求用一个sql语句输出下面结果
deptid username
1        ab
2        c
[要求用游标实现设计: OK_008
时间: 2006-05
备注:无
*/
create table #Temp1(deptid int,userid int,username varchar(20)) --待测试的数据表
create table #Temp2(deptid int,username varchar(20))                --结果表
--先把一些待测试的数据插入到待测试表#Temp1中
insert into #Temp1
select 1,100,‘a‘ union all
select 1,101,‘b‘ union all
select 1,131,‘d‘ union all
select 1,201,‘f‘ union all
select 2,302,‘c‘ union all
select 2,202,‘a‘ union all
select 2,221,‘e‘ union all
select 3,102,‘y‘ union all
select 3,302,‘e‘ union all
select 3,121,‘t‘
--
declare @deptid int,@username varchar(20)
--定义游标
declare Select_cursor cursor for
        select deptid,username from #Temp1
open Select_cursor
fetch next from Select_cursor into @deptid,@username    --提取操作的列数据放到局部变量中
while @@fetch_status=0      --返回被 FETCH 语句执行的最后游标的状态
/*
@@FETCH_STATUS =0          FETCH 语句成功
@@FETCH_STATUS =-1 FETCH 语句失败或此行不在结果集中
@@FETCH_STATUS =-2 被提取的行不存在
*/
        begin
                  --当表#Temp2列deptid存在相同的数据时,就直接在列username上追加@username值
                  if(exists(select * from #Temp2 where deptid=@deptid ))
                          update #Temp2 set username=username +@username where deptid=@deptid
                  else
                  --插入新数据
                          insert into #Temp2 select @deptid,@username
                  fetch next from Select_cursor into @deptid,@username
        end
close Select_cursor
deallocate Select_cursor
select * from #Temp2 --测试结果
Drop table #Temp1,#Temp2
时间: 2024-10-08 09:51:53

SQL 游标 Cursor 基本用法的相关文章

分组PARTITION BY及游标CURSOR的用法

基础数据表: select * from dbo.RecommendationChanelVersionRelation: 数据如下: 要求按照ChannelVersionID分组,对每组中的OrderId根据ID由小到大的顺序,更新为1,2,3,4,5... 方法一(分组PARTITION BY): IF OBJECT_ID('tempdb..#tempdt') IS NOT NULLDROP TABLE #tempdt;select RowNumOrderByChannelVersionID

学习使用MS SQL Server游标(CURSOR)

说实的,使用MS SQL Server这样久,游标一直没有使用过.以前实现相似的功能,都是使用WHILE循环加临时表来实现.刚才有参考网上示例练习写了一下.了解到游标概念与语法.下面代码示例中,先是宣告你在游标中需使用变量,也就是临时存储处理字段的数据.2. 宣告一个游标,并SELECT需要处理的数据集.3. 打开游标(#8行代码).4. 从游标中拿来FETCH NEXT 数据给变量赋值.5. 循环@@FETCH_STATUS = 0条件.6. 在循环块,可以处理第一笔的记录逻辑了.本示例中是P

SQL SERVER CURSOR游标的使用(转载)

一:认识游标 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合. 游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录. 二:游标的基本形式 声明游标:形式1DECLARE cursor_name [INSENSITIVE] [SCROLL] CURS

SQL Server 数据库的维护(四)__游标(cursor)

--维护数据库-- --游标(cursor)-- --概述: 注:使用select语句查询结果的结果集是一个整体,如果想每次处理一行或一部分行数据,游标可以提供这种处理机制.可以将游标理解为指针.指针指向哪条记录,哪条记录即是被操作记录. 游标处理结果集的方式: 1)允许定位在结果集的指定位置行. 2)从结果集的当前位置检索一行或一部分行记录. 3)支持对结果集当前位置做数据修改.删除等操作. --使用游标 注:使用游标定位和操作数据记录的一般步骤为:声明游标.打开游标.抽取数据.关闭游标和释放

Oracle中Cursor的用法

关键字 ?概念 ?类型 ?异常处理 一 概念 游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁 盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库.这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率. 二  类型   Cursor类型包含三种: 隐式Cursor,显式Cursor和Ref Cursor(动态Cursor). 1. 隐式Cursor: 1).对于Selec

从一个小例子认识SQL游标

原文:从一个小例子认识SQL游标 1    什么是游标: 关系数据库中的操作会对整个行集起作用. 例如,由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行. 这种由语句返回的完整行集称为结果集. 应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理. 这些应用程序需要一种机制以便每次处理一行或一部分行. 游标就是提供这种机制的对结果集的一种扩展. 游标通过以下方式来扩展结果处理: 允许定位在结果集的特定行. 从结果集的当前位置检索一行或一

Oracle笔记 九、PL/SQL 游标的使用

--演示隐式游标,系统自动声明,自动打开,自动使用并且自动关闭 begin update emp set sal = 1000; dbms_output.put_line('影响的行数:' || sql%rowcount); end;   rollback;   /*游标的使用方法: 第一步:声明游标 第二步:打开游标 第三步:使用游标进行循环操作 第四步:关闭游标*/   --普通游标,游标本身就是一个变量 declare --下面的这行代码声明了一个游标 cursor mycur is se

用SQL游标解决经典的1+2+...+100的问题!

以前从来没接触过SQL游标,今天第一次学习,就想到了编程语言里经典的1+2+...+100的问题. 环境是SqlServer2008. 建表语句: CREATE TABLE [dbo].[tCursor]( [ID] [int] NOT NULL, [Sum] [int] NULL) ON [PRIMARY] 然后填充ID为1~100,Sum为0. declare @i int set @i=1 while(@i <=100) begin insert into tCursor (ID,[Sum

SQL 游标的应用

----------------SQL游标应用-----------------if object_id('tempdb..#test0001') is not null drop table #test0001---------物料临时表create table #test0001(ItemCode nvarchar(30)----物料代码 ,SL DEC(19,3)----物料所需数量 ,RowsID Bigint----用于循环物料 )if object_id('tempdb..#test