begin
declare @a int,@error int --循环次数、异常数量
declare @PartnerId int
declare @time datetime
declare @name nvarchar(500)
declare @AddYear int =1 ;
declare @Count int =0 ;
declare @CreateTime date='2020-10-17';
declare @AfterDueTime date;
--
set @a=1
set @error=0
begin tran --申明事务
--申明游标 数据来源
declare order_cursor cursor
for (select Id,CreateTime,[Name] from [dbo].[Partner] )
--打开游标--
open order_cursor
--开始循环游标变量--
fetch next from order_cursor into @PartnerId,@time,@name
while @@FETCH_STATUS = 0 --返回被 FETCH语句执行的最后游标的状态--
begin
--------------在这里写每次循环的逻辑
select @Count=count( Id ) from [dbo].[PartnerSerialKey] where RenewId=0 and PartnerId=@PartnerId
--判断条件
if @Count=0
begin
--满足条件跳过此次循环
GOTO FORNEXT;
end
else
begin
--执行正常逻辑
set @AfterDueTime =dateadd( year,@AddYear, @CreateTime);
--添加财务记录
INSERT INTO [dbo].[Renew]
([PartnerId]
,[AddYear]
,[Count]
,[PreviousDueTime]
,[AfterDueTime]
,[CreateTime])
VALUES
(@PartnerId
,@AddYear
,@Count
,null
,@AfterDueTime
,@CreateTime)
declare @RenewId int =SCOPE_IDENTITY() ;
--更新旧的序列号数据
update [dbo].[PartnerSerialKey] set [RenewId]=@RenewId
where [RenewId]=0 AND [PartnerId]=@PartnerId
--更新旧的 已使用 序列号数据
update [dbo].[PartnerSerialKey] set [ExpirationDate]=dateadd( year,@AddYear, @CreateTime) -- 邵昌学说以 当前时间后推一年 不使用 [UseTime]
where [IsUse]=1 AND [PartnerId]=@PartnerId and [RenewId]=@RenewId
----------正常逻辑 end
print @name;
end
--记得将独立端的续费记录 同步到 我们正式服务器
--------记录异常
set @a=@a+1
set @error= @error + @@ERROR --记录每次运行sql后是否正确,0正确
FORNEXT: fetch next from order_cursor into @PartnerId,@time,@name --转到下一个游标
end
if @error=0
begin
commit tran --提交事务
end
else
begin
rollback tran --回滚事务
end
close order_cursor --关闭游标
deallocate order_cursor --释放游标
end
go