sql游标循环结果集

我们知道游标是一种对结果集操作的神器,使用游标,可以很方便的循环结果集,并对结果集进行数据处理。

1、建表

 1 CREATE TABLE [dbo].[Student](
 2     [Uid] [INT] IDENTITY(1,1) NOT NULL,
 3     [Name] [NCHAR](10) NULL,
 4     [BirthDay] [DATETIME] NULL,
 5     [Sex] [INT] NULL,
 6     [Age] [INT] NULL,
 7     [demo] [INT] NULL,
 8  CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED 
 9 (
10     [Uid] ASC
11 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
12 ) ON [PRIMARY]

2、sql代码实例:

 1 BEGIN
 2     DECLARE @a INT ,
 3         @error INT;    
 4     DECLARE @temp VARCHAR(50);
 5     SET @a = 2;
 6     SET @error = 0;
 7 
 8    --定义一个游标
 9     DECLARE order_cursor CURSOR
10    --申明游标为Uid
11     FOR
12         ( SELECT    [Uid]
13           FROM      Student
14         );
15     --打开游标--
16     OPEN order_cursor;
17     --开始循环游标变量--
18     FETCH NEXT FROM order_cursor INTO @temp;
19     WHILE @@FETCH_STATUS = 0    --返回被 FETCH语句执行的最后游标的状态--
20         BEGIN            
21             UPDATE  Student
22             SET     Age = 15 + @a ,
23                     demo = @a
24             WHERE   Uid = @temp;
25             SET @a = @a + 1;
26             SET @error = @error + @@ERROR;   --记录每次运行sql后是否正确,0正确
27             FETCH NEXT FROM order_cursor INTO @temp;   --转到下一个游标,没有会死循环
28         END;    
29     CLOSE order_cursor;  --关闭游标
30     DEALLOCATE order_cursor;   --释放游标
31 END;
32 GO
33 

查看表

 SELECT  * FROM    Student;

结果如下

3、实例2

下面是循环插入数据的SQL实例。

 1 declare @orderN varchar(50)--临时变量,用来保存游标值
 2 declare y_curr cursor FOR --申明游标 为orderNum
 3 
 4 SELECT  FContractNo
 5 FROM    dbo.v_ContractInfo
 6 WHERE   FDate >= '2019-04-01 00:00:000'
 7         AND PayMode = 1
 8         AND Fstatus = 1
 9         AND FranchiseeNo IN ( '60005', '60007', '60011', '60036', '60070', '60097', '60146' )
10         AND (WbStatus IS NULL OR WbStatus=0 ) AND FContractNo NOT IN (SELECT OrderNO FROM CF_BookingCheck )
11 open y_curr --打开游标
12 fetch next from Y_curr into @orderN ----开始循环游标变量
13 while(@@fetch_status=0)---返回被 FETCH  语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。
14 
15 BEGIN 
16 PRINT(@orderN)
17 INSERT INTO CF_BookingCheck (OrderNO,OverDays,WbStatus,FinanceType,WbChecker,WbCheckDate)VALUES (@orderN,0,3,0,'系统','2019-04-30 00:00:000')
18 fetch next from y_curr into @orderN --开始循环游标变量
19 END
20 close y_curr--关闭游标
21 deallocate y_curr --释放游标

 

posted @ 2019-01-10 16:30  laoyang01  阅读(346)  评论(0)    收藏  举报