前言:
前段時間新專案上線為了趕進度很多模組的功能都沒有經過詳細的測試導致了生成環境中的資料和實際資料對不上,因此需要自己手寫一個資料庫指令碼來更新下之前的資料。(線上資料庫用是SQL Server2012)關於資料統計彙總的問題肯定會用到遍歷統計彙總,那麼問題來了資料庫中如何遍歷呢?好像並沒有for和foreach這種型別的功能呀,不過關於資料庫遍歷最常見的方法當然是大家經常會想到的遊標啦,但是這次我並沒有使用遊標,而是通過建立臨時表的方式來更新遍歷資料的。
為什麼不使用遊標,而使用建立臨時表?
首先使用遊標的方式遍歷資料可能程式碼上比較直觀,但是程式碼比較繁瑣(宣告遊標,開啟遊標,使用遊標,關閉遊標和釋放遊標)並且不符合操作集合的原則,而且也非常的耗費效能,因此通常資料量比較大的情況下不推薦使用遊標。通過臨時表while遍歷資料,更符合我們日常的程式設計思想操作集合原則,效能上雖不敢保證表使用遊標要好多少,但是在把臨時表使用恰當的前提是能減少大量的效能消耗,並且使用起來非常簡單易懂。
通過建立臨時表遍歷更新資料:
注意:這裡只是一個簡單的臨時表更新例項。
我的目的是把TalkingSkillType表中的Sort值更新對應Id的值!
未更新前的資料如下圖所示:
臨時表遍歷更新SQL語句:
----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
遍歷更新成功後: