我们使用SQL语句处理数据时,可能会碰到一些需要循环遍历某个表并对其进行相应的操作(添加、修改、删除),这时我们就需要用到咱们在编程中常常用的for或foreach,但是在SQL中写循环往往显得那么吃力

要SQL中写类似for循环,我这里使用的是SQL中的游标来实现,当然SQL中也有for loop、while do等,我这里仅以使用游标方式来进行示例,其它的方式大家有兴趣可以研究一下,成功的同学可以在下面回复一下并把代码贴出来,与大家分享!

闲话少说,上示例:

  1. 利用游标循环更新、删除MemberAccount表中的数据
DECLARE My_Cursor CURSOR --定义游标 
FOR (SELECT * FROM dbo.MemberAccount) --查出需要的集合放到游标中 
OPEN My_Cursor; --打开游标 
FETCH NEXT FROM My_Cursor ; --读取第一行数据 
WHILE @@FETCH_STATUS = 0     
  BEGIN         
    --UPDATE dbo.MemberAccount SET UserName = UserName + 'A' WHERE CURRENT OF My_Cursor; --更新         
    --DELETE FROM dbo.MemberAccount WHERE CURRENT OF My_Cursor; --删除         
      FETCH NEXT FROM My_Cursor; --读取下一行数据     
  CLOSE My_Cursor; --关闭游标 
  DEALLOCATE My_Cursor; --释放游标 
  1. 利用游标循环更新MemberService表中的数据(更新每个用户所购买服务的时间)
DECLARE @UserId varchar(50)  
DECLARE My_Cursor CURSOR --定义游标 
FOR (SELECT UserId FROM dbo.MemberAccount) --查出需要的集合放到游标中 
OPEN My_Cursor; --打开游标 
FETCH NEXT FROM My_Cursor INTO @UserId; --读取第一行数据(将MemberAccount表中的UserId放到@UserId变量中) 
WHILE @@FETCH_STATUS = 0     
    BEGIN         PRINT @UserId; --打印数据(打印MemberAccount表中的UserId)         
    UPDATE dbo.MemberService SET ServiceTime = DATEADD(Month, 6, getdate()) WHERE UserId =         @UserId; --更新数据         
    FETCH NEXT FROM My_Cursor INTO @UserId; --读取下一行数据(将MemberAccount表中的UserId放到@UserId变量中)     
    END CLOSE My_Cursor; --关闭游标 
DEALLOCATE My_Cursor; --释放游标 

上面的两个例子应该可以解决我们在SQL中使用循环的所有需求,如果不能满足,自己可以根据以上两个示例进行扩展,希望能帮各位解决一些类似的问题。

FOR循环重复的控制结构,可以有效地编写需要执行的特定次数的循环。操作语法如下:FOR counter IN [reverse] initial_value .. final_value LOOP sequence_of_statements; END LOOP;操作实例源码:-- Created on 2018/3/23 by E.WANG FOR counter IN [...
select frestkey+CAST(FCodeID AS VARCHAR(12))+FType as fkey,ROW_NUMBER() OVER(ORDER BY fkey) AS rowNumber into #depTemp--建立临时表 from CodeSet declare @max int--获得最大的rowNumber select @max=max(rownumber)
DECLARE @au_id varchar(11), @au_fname varchar(20) --申明变量 --申明一个游标 DECLARE authors_cursor CURSOR FOR SELECT au_id, au_fname FROM authors --打开游标 OPEN authors_cursor --取出值 FETCH NEXT FROM authors_curso
WITH AS短语,也叫做子查询部分(subquery factoring),是用来定义一个SQL片断,该SQL片断会被整个SQL语句所用到。这个语句算是公用表表达式(CTE),对于with 的循环 sql 2008有限制,最大只能递归 100 次,08以上就没有测试过,下面来测试看看。 如我想生成1到200行的数据 代码:with t as ( select 1 as id 
select ROW_NUMBER() OVER(ORDER BY rid) ROWNU ,* into #skunoList from [Mst_SKU] where [SKUNo] like '%102-%' DECLARE @iLoop int,--某一行的记录 @MaxID int--总行数 select @MaxID =(select COUNT(skun...
问题:在SQLserver如何访问指定行的数据? 这里就要使用到了游标的概念?给大家推荐一位大佬的写的文章  http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html  declare test_cursor cursor scroll for select * from ScoreMsg
今天遇到1个很是无语的问题。。。由于开发人员的版本更新导致用户在今天所开之单据的CreatDate都变成了yyyy-MM-dd格式,原本应该为yyyy-MM-dd hh:mm:ss:fff格式。于是,只能手动更新数据了 -_-! 1declare@itemnumberint--定义需要循环的次数2declare@tagintint--定义标志字段,用于结...
sql = """select top 10000 Key_ID,Hospital_Name as '诊断入参' from Hospital_Record where Key_ID not in (select top {} Key_ID from Hospital_Record order by Key_ID) order by Key_ID;""".format(st.
  曾经,sql循环处理当前行数据和上一行数据浪费了我不少时间,学会后才发现如此容易,其实学问就是如此,难者不会,会者不难。   以下事例,使用游标循环表#temptable数据,然后让当前行和上一行的argument1 相加 存放到当前行的 argument2 ,比较简单。 --drop table #temptable create table #temptable 异常:Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} 49498