前段时间新项目上线为了赶进度不少模块的功能都没有通过详细的测试致使了生成环境中的数据和实际数据对不上,所以须要本身手写一个数据库脚原本更新下以前的数据。(线上数据库用是SQL Server2012)关于数据统计汇总的问题确定会用到遍历统计汇总,那么问题来了数据库中如何遍历呢?好像并无for和foreach这种类型的功能呀,不过关于数据库遍历最多见的方法固然是你们常常会想到的游标啦,可是此次我并无使用游标,而是经过建立临时表的方式来更新遍历数据的。sql
首先使用游标的方式遍历数据可能代码上比较直观,可是代码比较繁琐(声明游标,打开游标,使用游标,关闭游标和释放游标)而且不符合操做集合的原则,并且也很是的耗费性能,所以一般数据量比较大的状况下不推荐使用游标。经过临时表while遍历数据,更符合咱们平常的编程思想操做集合原则,性能上虽不敢保证表使用游标要好多少,可是在把临时表使用恰当的前提是能减小大量的性能消耗,而且使用起来很是简单易懂。数据库
注意:这里只是一个简单的临时表更新实例。编程
个人目的是把TalkingSkillType表中的Sort值更新对应Id的值!性能
未更新前的数据以下图所示:测试
----SQL SERVER经过临时表遍历数据 -- 判断是否存在(object(‘objectname’,‘type’)) IF OBJECT_ID('tempdb.dbo.#temp','U') IS NOT NULL DROP TABLE dbo.#temp; GO -- 声明变量 DECLARE @ID AS INT, @Name AS VARCHAR(50), @Num AS INT --数据插入临时表(select * INTO #Temp from 来源表) SELECT ID,Name INTO #temp FROM TalkingSkillType --查询临时表中数据 --SELECT * FROM #temp set @Num=0 --赋初始值 --查询是否存在记录,只要存在会一直循环直到不存在(WHILE EXISTS) WHILE EXISTS(SELECT ID FROM #temp) BEGIN set @Num= @Num + 1 -- 取值(把临时表中的值赋值给定义的变量) SELECT top 1 @ID= ID,@Name=Name FROM #temp; -- 输出操做 PRINT(@Num) --更新 UPDATE TalkingSkillType SET Sort=@ID where id=@ID -- 删除本次操临时表中的数据(避免无限循环) DELETE FROM #temp WHERE ID=@ID; END --删除临时表 #temp --drop table #temp
遍历更新成功后:spa