sql如何遍歷幾百萬的表 如何用SQL遍歷整張表

2021-10-12 15:37:15 字數 3105 閱讀 3205

使用游標

使用表變數

使用臨時表

我的需求是:針對hr.employees表,新增一列fullname,並取值firstname+lastname。

-- 需求是,新增一列fullname,取值firstname+lastnamealter table hr.employees add fullname nvarchar(30) null;go

原始效果如下圖。

這個需求本來可以一條sql語句搞定,如下**所示。但是為了演示表的遍歷,我還是使用了這三種方式來實現一下。

use tsqlfundamentals2008;goupdate hr.employees set fullname= firstname+' '+lastname;

使用游標

使用游標的**比較繁瑣,概括起來主要有以下幾個步驟,宣告游標,開啟游標,使用游標,關閉游標和釋放游標。示例**如下。

-- 方法1:游標-- 宣告變數declare

@empid as int,    @firstname as nvarchar(10),    @lastname as nvarchar(20);

-- 宣告游標declare c_employees cursor fast_forward for

select empid,firstname,lastname

from hr.employees    order by empid;

open c_employees;-- 取第一條記錄fetch next from c_employees into @empid,@firstname,@lastname;while @@fetch_status=0begin

-- 操作

update hr.employees set fullname= @firstname+' '+@lastname where empid=@empid;

-- 取下一條記錄

fetch next from c_employees into @empid,@firstname,@lastname;end-- 關閉游標close c_employees;-- 釋放游標deallocate c_employees;

執行指令碼,效果如下圖。

可以看到,已經達到我們想要的效果了。

使用表變數

因為使用游標存在效能和違背面向集合思想的問題,所以我們有必要用面向集合的思想去找到一種更好的解決方案,下面這種方法是使用表變數的方式實現的,**如下。

1 -- 方法2:使用表變數

2 -- 宣告表變數

3 declare @temp table

4 (5     empid int,

6     firstname nvarchar(10),

7     lastname nvarchar(20)

8 );

10 -- 將源表中的資料插入到表變數中

11 insert into @temp(empid, firstname, lastname )

12 select empid,firstname,lastname from hr.employees

13 order by empid;

15 -- 宣告變數

16 declare

17     @empid as int,

18     @firstname as nvarchar(10),

19     @lastname as nvarchar(20);

21 while exists(select empid from @temp)

22 begin

23     -- 也可以使用top 1

24     set rowcount 1

25     select @empid= empid, @firstname= firstname,@lastname= lastname from @temp;

26     update hr.employees set fullname= @firstname+' '+@lastname where empid=@empid;

27     set rowcount 0

29     delete from @temp where empid=@empid;

30 end

使用臨時表

臨時表也可以實現表變數的功能,所以我們也可以使用臨時表來實現這個需求,**如下。

1 -- 方法3:使用臨時表

2 -- 建立臨時表

3 if object_id('tempdb.dbo.#tempemployees','u') is not null drop table dbo.#tempemployees;

4 go

6 select empid,firstname,lastname

7 into dbo.#tempemployees

8 from hr.employees

9 order by empid;

11 --select * from dbo.#tempemployees;

13 -- 宣告變數

14 declare

15     @empid as int,

16     @firstname as nvarchar(10),

17     @lastname as nvarchar(20);

19 while exists(select empid from dbo.#tempemployees)

20 begin

21     -- 也可以使用top 1

22     set rowcount 1

23     select @empid= empid, @firstname= firstname,@lastname= lastname from dbo.#tempemployees;

24     update hr.employees set fullname= @firstname+' '+@lastname where empid=@empid;

25     set rowcount 0

27     delete from dbo.#tempemployees where empid=@empid;

28 end

當然,實現的效果都是一樣的。

如何用sql語句去掉列的自增長 identity

如何用sql語句去掉列的自增長 identity 無法通過alter把現有自增字段改為非自增 比如alter table a alter id int,自增屬性不會去掉 通過修改系統表可以做到 此法可能有不可預知的結果,慎之.sp configure allow updates 1 go recon...

如何用SQL動態擷取字串的長度

我們都知道,sql擷取字串的固定長度,可以有sub 函式,rigth 函式,或者left 函式.如果擷取的字串是動態的乙個字段,那麼顯然,以上3個函式是不適用的.那麼如何動態的擷取字串的長度呢?比如 乙個表裡面有這麼validdate欄位,它的資料是這樣的形式插進去的,1,年 2,年 6,月 12,...

MySQL如何刪除 sql開頭的臨時表

巡檢時發現伺服器磁碟空間不足,通過檢視大檔案進行篩選是發現有幾個 sql開頭的檔案,且存在超過100g及10g以上的檔案。如果mysql在乙個 alter table操作 algorithm inplace 的中間退出,那麼可能會留下乙個占用系統空間的臨時表。例如,在對一張表 大表 新增索引時中途中...