SQL Server如何通過創(chuàng)建臨時表遍歷更新數(shù)據詳解
前言:
前段時間新項目上線為了趕進度很多模塊的功能都沒有經過詳細的測試導致了生成環(huán)境中的數(shù)據和實際數(shù)據對不上,因此需要自己手寫一個數(shù)據庫腳本來更新下之前的數(shù)據。(線上數(shù)據庫用是SQL Server2012)關于數(shù)據統(tǒng)計匯總的問題肯定會用到遍歷統(tǒng)計匯總,那么問題來了數(shù)據庫中如何遍歷呢?好像并沒有for和foreach這種類型的功能呀,不過關于數(shù)據庫遍歷最常見的方法當然是大家經常會想到的游標啦,但是這次我并沒有使用游標,而是通過創(chuàng)建臨時表的方式來更新遍歷數(shù)據的。
為什么不使用游標,而使用創(chuàng)建臨時表?
首先使用游標的方式遍歷數(shù)據可能代碼上比較直觀,但是代碼比較繁瑣(聲明游標,打開游標,使用游標,關閉游標和釋放游標)并且不符合操作集合的原則,而且也非常的耗費性能,因此通常數(shù)據量比較大的情況下不推薦使用游標。通過臨時表while遍歷數(shù)據,更符合我們日常的編程思想操作集合原則,性能上雖不敢保證表使用游標要好多少,但是在把臨時表使用恰當?shù)那疤崾悄軠p少大量的性能消耗,并且使用起來非常簡單易懂。
通過創(chuàng)建臨時表遍歷更新數(shù)據:
注意:這里只是一個簡單的臨時表更新實例。
我的目的是把TalkingSkillType表中的Sort值更新成為與Id一樣的值!
未更新前的數(shù)據如下圖所示:
臨時表遍歷更新SQL語句:
----SQL SERVER通過臨時表遍歷數(shù)據 -- 判斷是否存在(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 --數(shù)據插入臨時表(select * INTO #Temp from 來源表) SELECT ID,Name INTO #temp FROM TalkingSkillType --查詢臨時表中數(shù)據 --SELECT * FROM #temp set @Num=0 --賦初始值 --查詢是否存在記錄,只要存在會一直循環(huán)直到不存在(WHILE EXISTS) WHILE EXISTS(SELECT ID FROM #temp) BEGIN set @Num= @Num + 1 -- 取值(把臨時表中的值賦值給定義的變量) SELECT top 1 @ID= ID,@Name=Name FROM #temp; -- 輸出操作(用于查看執(zhí)行效果) PRINT(@Num) --更新 UPDATE TalkingSkillType SET Sort=@ID where id=@ID -- 刪除本次操臨時表中的數(shù)據(避免無限循環(huán)) DELETE FROM #temp WHERE ID=@ID; END --刪除臨時表 #temp --drop table #temp
PRINT(@Num)輸入日志:
遍歷更新成功后結果如下圖所示:
總結
到此這篇關于SQL Server如何通過創(chuàng)建臨時表遍歷更新數(shù)據的文章就介紹到這了,更多相關SQL Server創(chuàng)建臨時表遍歷更新數(shù)據內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MSSQL2005數(shù)據附加失敗報錯3456解決辦法
今天在把數(shù)據庫備份出去,再到另一臺服務器上進行數(shù)據還原時出現(xiàn),數(shù)據附加失敗錯誤3456提示,下面來看我的解決過程2012-09-09SQL?Server使用T-SQL進階之公用表表達式(CTE)
這篇文章介紹了SQL?Server中T-SQL的公用表表達式(CTE),文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05SQL?Server數(shù)據庫備份和恢復數(shù)據庫的全過程
最近在功能調試前需要先將測試數(shù)據庫備份,然后功能調試之后再將測試數(shù)據庫還原,這樣就可以重復的進行功能調試,這篇文章主要給大家介紹了關于SQL?Server數(shù)據庫備份和恢復數(shù)據庫的相關資料,需要的朋友可以參考下2022-06-06SQL Server誤區(qū)30日談 第2天 DBCC CHECKDB會導致阻塞
在SQL Server 2000中,這個命令阻止事務日志截斷將會導致日志不正常增長的相關問題,但對于SQL Server 2005來說,這個命令就會導致快照相關的問題(具體請往下看)。2013-01-01SQL Server存儲過程(數(shù)據庫引擎)使用詳解
存儲過程(Stored Procedure)是預編譯SQL語句集合,這些語句存儲在一個名稱(存儲過程的名稱)下并作為單元來處理,存儲過程代替了傳統(tǒng)的逐條執(zhí)行SQL語句的方式,本文小編給大家介紹了SQL Server存儲過程(數(shù)據庫引擎)使用,需要的朋友可以參考下2023-11-11