我们使用SQL语句处理数据时,可能会碰到一些需要循环遍历某个表并对其进行相应的操作(添加、修改、删除),这时我们就需要用到咱们在编程中常常用的for或foreach,但是在SQL中写循环往往显得那么吃力
要SQL中写类似for循环,我这里使用的是SQL中的游标来实现,当然SQL中也有for loop、while do等,我这里仅以使用游标方式来进行示例,其它的方式大家有兴趣可以研究一下,成功的同学可以在下面回复一下并把代码贴出来,与大家分享!
闲话少说,上示例:
-
利用游标循环更新、删除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; --释放游标
- 利用游标循环更新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