SQL Cursor 基本用法


1 table1結構如下
 2 id    int
 3 name  varchar(50)
 4 
 5 declare @id int
 6 declare @name varchar(50)
 7 declare cursor1 cursor for         --定義游標cursor1
 8 select * from table1               --使用游標的對象(跟據需要填入select文)
 9 open cursor1                       --打開游標
10 
11 fetch next from cursor1 into @id,@name  --將游標向下移1行,獲取的數據放入之前定義的變量@id,@name中
12 
13 while @@fetch_status=0           --判斷是否成功獲取數據
14 begin
15 update table1 set name=name+'1'
16 where id=@id                           --進行相應處理(跟據需要填入SQL文)
17 
18 fetch next from cursor1 into @id,@name  --將游標向下移1行
19 end
20 
21 close cursor1                   --關閉游標
22 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM