sql server中的循环遍历
1.普通循环(while)
有点类似python代码的写法
select djlsh,GSKH,PXH from BGZLLRB where DjLsh=8806 order by PXH
先从数据库里取一组数据
declare @a int
set @a=1
while @a<5
begin
--处理数据
update BGZLLRB set PXH=pxh+1 where DjLsh=8806
set @a = @a +1
end
一共循环了四次,每次加一, 结果如下
2 游标循环
有点类似python的迭代器,一条一条的取出数据处理
用上面循环后的数据,进行下面的循环
DECLARE @pxh int,@djlsh int,@gskh varchar(50)
declare order_cursor cursor --定义游标
for (select djlsh,GSKH,PXH from BGZLLRB where DjLsh=8806) --为游标赋值一个数据集
open order_cursor --打开游标
fetch next from order_cursor into @djlsh,@GSKH,@PXH --开始循环游标变量(从数据集中拿出第一条数据)
while @@FETCH_STATUS = 0 --返回被 FETCH语句执行的最后游标的状态 (固定写法)
begin
update BGZLLRB set PXH=pxh-4 where DjLsh=@djlsh and GSKH=@gskh
fetch next from order_cursor into @djlsh,@GSKH,@PXH --转到下一个游标(取下条数据集)
end
close order_cursor -- 关闭游标
deallocate order_cursor -- 释放游标
游标循环后 的结果如下
3.游标循环 (事务)
跟游标循环差不多,无非就是多加了事务
还是用上面游标循环后的数据去处理
DECLARE @pxh int,@djlsh int,@gskh varchar(50),@error int
set @error =0
BEGIN TRAN --申明事务
declare order_cursor cursor
for (select djlsh,GSKH,PXH from BGZLLRB where DjLsh=8806)
open order_cursor
fetch next from order_cursor into @djlsh,@GSKH,@PXH
while @@FETCH_STATUS = 0
begin
update BGZLLRB set PXH=pxh-1 where DjLsh=8806 and GSKH=@gskh
set @error=@error+@@error--记录每次运行sql后是否正确,数值为0正确
print(@@error) --如果有错,可以看出哪条记录出错
fetch next from order_cursor into @djlsh,@GSKH,@PXH
end
close order_cursor
deallocate order_cursor
IF @error=0
BEGIN
commit tran--提交
end
ELSE
BEGIN
ROLLBACK TRAN--回滚
END
游标循环 (事务) 后 结果如下:
事务的好处是: 处理多条数据或者是多条sql去处理数据的时候,保证你的所有操作的一致性,要么一起错,要么一起处理完。当然如果你处理数据,处理错了,并且提交了,更新到数据库里了,也可以进行事务回滚,代码就不是我这样写了(要更复杂,我也不会)。