SQL Server如何通過創(chuàng)建臨時表遍歷更新數(shù)據(jù)詳解
:
前段時間新項(xiàng)目上線為了趕進(jìn)度很多模塊的功能都沒有經(jīng)過詳細(xì)的測試導(dǎo)致了生成環(huán)境中的數(shù)據(jù)和實(shí)際數(shù)據(jù)對不上,因此需要自己手寫一個數(shù)據(jù)庫腳本來更新下之前的數(shù)據(jù)。(線上數(shù)據(jù)庫用是SQL Server2012)關(guān)于數(shù)據(jù)統(tǒng)計匯總的問題肯定會用到遍歷統(tǒng)計匯總,那么問題來了數(shù)據(jù)庫中如何遍歷呢?好像并沒有for和foreach這種類型的功能呀,不過關(guān)于數(shù)據(jù)庫遍歷最常見的方法當(dāng)然是大家經(jīng)常會想到的游標(biāo)啦,但是這次我并沒有使用游標(biāo),而是通過創(chuàng)建臨時表的方式來更新遍歷數(shù)據(jù)的。
為什么不使用游標(biāo),而使用創(chuàng)建臨時表?
首先使用游標(biāo)的方式遍歷數(shù)據(jù)可能代碼上比較直觀,但是代碼比較繁瑣(聲明游標(biāo),打開游標(biāo),使用游標(biāo),關(guān)閉游標(biāo)和釋放游標(biāo))并且不符合操作集合的原則,而且也非常的耗費(fèi)性能,因此通常數(shù)據(jù)量比較大的情況下不推薦使用游標(biāo)。通過臨時表while遍歷數(shù)據(jù),更符合我們?nèi)粘5木幊趟枷氩僮骷显瓌t,性能上雖不敢保證表使用游標(biāo)要好多少,但是在把臨時表使用恰當(dāng)?shù)那疤崾悄軠p少大量的性能消耗,并且使用起來非常簡單易懂。
通過創(chuàng)建臨時表遍歷更新數(shù)據(jù):
注意:這里只是一個簡單的臨時表更新實(shí)例。
我的目的是把TalkingSkillType表中的Sort值更新成為與Id一樣的值!
未更新前的數(shù)據(jù)如下圖所示:
臨時表遍歷更新SQL語句:
----SQL SERVER通過臨時表遍歷數(shù)據(jù) -- 判斷是否存在(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ù)據(jù)插入臨時表(select * INTO #Temp from 來源表) SELECT ID,Name INTO #temp FROM TalkingSkillType --查詢臨時表中數(shù)據(jù) --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ù)據(jù)(避免無限循環(huán)) DELETE FROM #temp WHERE ID=@ID; END --刪除臨時表 #temp --drop table #temp
PRINT(@Num)輸入日志:
遍歷更新成功后結(jié)果如下圖所示:
總結(jié)
到此這篇關(guān)于SQL Server如何通過創(chuàng)建臨時表遍歷更新數(shù)據(jù)的文章就介紹到這了,更多相關(guān)SQL Server創(chuàng)建臨時表遍歷更新數(shù)據(jù)內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。