SQL 循环语句几种写法
摘自:https://www.cnblogs.com/guorongtao/p/11939751.html
1、正常循环语句
declare @orderNum varchar(255) create table #ttableName(id int identity(1,1),Orders varchar(255)) declare @n int,@rows int insert #ttableName(orders) select orderNum from pe_Orders where orderId<50 --select @rows=count(1) from pe_Orders select @rows =@@rowcount set @n=1 while @n<=@rows begin select @orderNum=OrderNum from PE_Orders where OrderNum=(select Orders from #ttableName where id=@n) print (@OrderNum) select @n=@n+1 end drop table #ttableName
2、不带事务的游标循环
declare @orderN varchar(50) --临时变量,用来保存游标值 declare y_curr cursor for --申明游标 为orderNum select orderNum from pe_Orders where orderId<50 open y_curr --打开游标 fetch next from Y_curr into @orderN ----开始循环游标变量 while(@@fetch_status=0) ---返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。 begin print (@orderN) update pe_Orders set Functionary+@orderN where orderNum=@orderN --操作数据库 fetch next from y_curr into @orderN --开始循环游标变量 end close y_curr --关闭游标 deallocate y_curr --释放游标
3、带事务的游标循环
select orderNum,userName,MoneyTotal into #t from pe_Orders po DECLARE @n int,@error int --set @n=1 set @error=0 BEGIN TRAN --申明 开始事务 declare @orderN varchar(50),@userN varchar(50) --临时变量,用来保存游标值 declare y_curr cursor for --申明游标 为orderNum,userName select orderNum,userName from PE_Orders where Orderid<50 open y_curr fetch next from y_curr into @orderN,@userN while @@fetch_status = 0 BEGIN select isnull(sum(MoneyTotal),0),orderNum from #t where username=@userN -- set @n=@n+1 set @error=@error+@@error --记录每次运行sql后 是否正确 0正确 fetch next from y_curr into @orderN,@userN END IF @error=0 BEGIN commit tran ---事务提交 END ELSE BEGIN ROLLBACK TRAN ---事务回滚 END close y_curr deallocate y_curr DROP TABLE #t
4、if语句使用示例
declare @a int set @a=12 if @a>100 begin print @a end else begin print 'no' end
5、while语句使用示例
declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @i=@i+1 end -- 设置重复执行 SQL 语句或语句块的条件。只要指定的条件为真,就重复执行语句。可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。 本条为以前从网上查找获取!
6、临时表和try
-- 增加临时表 select * into #csj_temp from csj -- 删除临时表 用到try begin try -- 检测代码开始 drop table #csj_temp end try begin catch -- 错误开始 end catch
7、游标循环读记录
declare @temp_temp int --declare @Cur_Name --@Cur_Name="aaa" --------------------------------- 创建游标 --Local(本地游标) DECLARE aaa CURSOR for select House_Id from House_House where Deleted=0 or deleted is null ----------------------------------- 打开游标 Open aaa ----------------------------------- 遍历和获取游标 fetch next from aaa into @temp_temp --print @temp_temp while @@fetch_status=0 begin --做你要做的事 select * from House_monthEnd where House_Id=@temp_temp fetch next from aaa into @temp_temp -- 取值赋给变量 -- end ----------------------------------- 关闭游标 Close aaa ----------------------------------- 删除游标 Deallocate aaa