前段時間新項目上線爲了趕進度不少模塊的功能都沒有通過詳細的測試致使了生成環境中的數據和實際數據對不上,所以須要本身手寫一個數據庫腳原本更新下以前的數據。(線上數據庫用是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