我们知道游标是一种对结果集操作的神器,使用游标,可以很方便的循环结果集,并对结果集进行数据处理。
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 --释放游标