SQL Server如何通過創(chuàng)建臨時(shí)表遍歷更新數(shù)據(jù)詳解
前言:
前段時(shí)間新項(xiàng)目上線為了趕進(jìn)度很多模塊的功能都沒有經(jīng)過詳細(xì)的測(cè)試導(dǎo)致了生成環(huán)境中的數(shù)據(jù)和實(shí)際數(shù)據(jù)對(duì)不上,因此需要自己手寫一個(gè)數(shù)據(jù)庫腳本來更新下之前的數(shù)據(jù)。(線上數(shù)據(jù)庫用是SQL Server2012)關(guān)于數(shù)據(jù)統(tǒng)計(jì)匯總的問題肯定會(huì)用到遍歷統(tǒng)計(jì)匯總,那么問題來了數(shù)據(jù)庫中如何遍歷呢?好像并沒有for和foreach這種類型的功能呀,不過關(guān)于數(shù)據(jù)庫遍歷最常見的方法當(dāng)然是大家經(jīng)常會(huì)想到的游標(biāo)啦,但是這次我并沒有使用游標(biāo),而是通過創(chuàng)建臨時(shí)表的方式來更新遍歷數(shù)據(jù)的。
為什么不使用游標(biāo),而使用創(chuàng)建臨時(shí)表?
首先使用游標(biāo)的方式遍歷數(shù)據(jù)可能代碼上比較直觀,但是代碼比較繁瑣(聲明游標(biāo),打開游標(biāo),使用游標(biāo),關(guān)閉游標(biāo)和釋放游標(biāo))并且不符合操作集合的原則,而且也非常的耗費(fèi)性能,因此通常數(shù)據(jù)量比較大的情況下不推薦使用游標(biāo)。通過臨時(shí)表while遍歷數(shù)據(jù),更符合我們?nèi)粘5木幊趟枷氩僮骷显瓌t,性能上雖不敢保證表使用游標(biāo)要好多少,但是在把臨時(shí)表使用恰當(dāng)?shù)那疤崾悄軠p少大量的性能消耗,并且使用起來非常簡(jiǎn)單易懂。
通過創(chuàng)建臨時(shí)表遍歷更新數(shù)據(jù):
注意:這里只是一個(gè)簡(jiǎn)單的臨時(shí)表更新實(shí)例。
我的目的是把TalkingSkillType表中的Sort值更新成為與Id一樣的值!
未更新前的數(shù)據(jù)如下圖所示:

臨時(shí)表遍歷更新SQL語句:
----SQL SERVER通過臨時(shí)表遍歷數(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ù)插入臨時(shí)表(select * INTO #Temp from 來源表)
SELECT ID,Name INTO #temp FROM TalkingSkillType
--查詢臨時(shí)表中數(shù)據(jù)
--SELECT * FROM #temp
set @Num=0 --賦初始值
--查詢是否存在記錄,只要存在會(huì)一直循環(huán)直到不存在(WHILE EXISTS)
WHILE EXISTS(SELECT ID FROM #temp)
BEGIN
set @Num= @Num + 1
-- 取值(把臨時(shí)表中的值賦值給定義的變量)
SELECT top 1 @ID= ID,@Name=Name FROM #temp;
-- 輸出操作(用于查看執(zhí)行效果)
PRINT(@Num)
--更新
UPDATE TalkingSkillType SET Sort=@ID where id=@ID
-- 刪除本次操臨時(shí)表中的數(shù)據(jù)(避免無限循環(huán))
DELETE FROM #temp WHERE ID=@ID;
END
--刪除臨時(shí)表 #temp
--drop table #temp
PRINT(@Num)輸入日志:

遍歷更新成功后結(jié)果如下圖所示:

總結(jié)
到此這篇關(guān)于SQL Server如何通過創(chuàng)建臨時(shí)表遍歷更新數(shù)據(jù)的文章就介紹到這了,更多相關(guān)SQL Server創(chuàng)建臨時(shí)表遍歷更新數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對(duì)有自增長(zhǎng)字段的表導(dǎo)入數(shù)據(jù)注意事項(xiàng)
對(duì)有自增長(zhǎng)字段的表導(dǎo)入數(shù)據(jù)注意事項(xiàng)2008-12-12
配置 SQL Server 2005 以允許遠(yuǎn)程連接的方法
在嘗試從遠(yuǎn)程計(jì)算機(jī)連接到 Microsoft SQL Server 2005 實(shí)例時(shí),可能會(huì)接收到錯(cuò)誤消息。在使用任何程序連接到 SQL Server 時(shí)都可能會(huì)發(fā)生此問題。2011-01-01
sql?server自動(dòng)生成拼音首字母的函數(shù)
建立一個(gè)查詢,執(zhí)行語句生成函數(shù)fn_GetPy,下面是具體的實(shí)現(xiàn),需要的朋友可以參考下2014-01-01
MSSQL2005數(shù)據(jù)附加失敗報(bào)錯(cuò)3456解決辦法
今天在把數(shù)據(jù)庫備份出去,再到另一臺(tái)服務(wù)器上進(jìn)行數(shù)據(jù)還原時(shí)出現(xiàn),數(shù)據(jù)附加失敗錯(cuò)誤3456提示,下面來看我的解決過程2012-09-09
SQL?Server使用T-SQL進(jìn)階之公用表表達(dá)式(CTE)
這篇文章介紹了SQL?Server中T-SQL的公用表表達(dá)式(CTE),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
SQL?Server數(shù)據(jù)庫備份和恢復(fù)數(shù)據(jù)庫的全過程
最近在功能調(diào)試前需要先將測(cè)試數(shù)據(jù)庫備份,然后功能調(diào)試之后再將測(cè)試數(shù)據(jù)庫還原,這樣就可以重復(fù)的進(jìn)行功能調(diào)試,這篇文章主要給大家介紹了關(guān)于SQL?Server數(shù)據(jù)庫備份和恢復(fù)數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2022-06-06
SQL Server誤區(qū)30日談 第2天 DBCC CHECKDB會(huì)導(dǎo)致阻塞
在SQL Server 2000中,這個(gè)命令阻止事務(wù)日志截?cái)鄬?huì)導(dǎo)致日志不正常增長(zhǎng)的相關(guān)問題,但對(duì)于SQL Server 2005來說,這個(gè)命令就會(huì)導(dǎo)致快照相關(guān)的問題(具體請(qǐng)往下看)。2013-01-01
SQL Server存儲(chǔ)過程(數(shù)據(jù)庫引擎)使用詳解
存儲(chǔ)過程(Stored Procedure)是預(yù)編譯SQL語句集合,這些語句存儲(chǔ)在一個(gè)名稱(存儲(chǔ)過程的名稱)下并作為單元來處理,存儲(chǔ)過程代替了傳統(tǒng)的逐條執(zhí)行SQL語句的方式,本文小編給大家介紹了SQL Server存儲(chǔ)過程(數(shù)據(jù)庫引擎)使用,需要的朋友可以參考下2023-11-11

