SQL Server遍歷表的幾種方法

2022-08-31 14:00:28 字數 3503 閱讀 1709

閱讀目錄

在資料庫開發過程中,我們經常會碰到要遍歷資料表的情形,一提到遍歷表,我們第一印象可能就想到使用游標,使用游標雖然直觀易懂,但是它不符合面向集合操作的原則,而且效能也比面向集合低。當然,從面向集合操作的角度出發,也有兩種方法可以進行遍歷表的操作,總結起來,遍歷表有下面幾種方法。

使用游標

使用表變數

使用臨時表

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

-- 需求是,新增一列fullname,取值firstname+lastname

alter 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=0

begin

-- 操作

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 );

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

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

12 select empid,firstname,lastname from hr.employees

13 order by empid;

14 15 -- 宣告變數

16 declare

17 @empid as int,

18 @firstname as nvarchar(10),

19 @lastname as nvarchar(20);

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

28

29 delete from @temp where empid=@empid;

30 end

回到頂部

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

-- 方法3:使用臨時表

-- 建立臨時表

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

goselect empid,firstname,lastname

into dbo.#tempemployees

from hr.employees

order by empid;

--select * from dbo.#tempemployees;

-- 宣告變數

declare

@empid as int,

@firstname as nvarchar(10),

@lastname as nvarchar(20);

while exists(select empid from dbo.#tempemployees)

begin

-- 也可以使用top 1

set rowcount 1

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

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

set rowcount 0

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

end

SQL Server遍歷表的幾種方法

原文 sql server遍歷表的幾種方法 在資料庫開發過程中,我們經常會碰到要遍歷資料表的情形,一提到遍歷表,我們第一印象可能就想到使用游標,使用游標雖然直觀易懂,但是它不符合面向集合操作的原則,而且效能也比面向集合低。當然,從面向集合操作的角度出發,也有兩種方法可以進行遍歷表的操作,總結起來,遍...

SQL Server遍歷表的幾種方法

在資料庫開發過程中,我們經常會碰到要遍歷資料表的情形,一提到遍歷表,我們第一印象可能就想到使用游標,使用游標雖然直觀易懂,但是它不符合面向集合操作的原則,而且效能也比面向集合低。當然,從面向集合操作的角度出發,也有兩種方法可以進行遍歷表的操作,總結起來,遍歷表有下面幾種方法。使用游標 使用表變數 使...

SQL Server中幾種遍歷方式比較

sql遍歷解析 在sql的儲存過程,函式中,經常需要使用遍歷 遍歷table 其中游標 臨時表等遍歷方法很常用。面對小資料量,這幾種遍歷方法均可行,但是面臨大資料量時,就需要擇優選擇,不同的遍歷方法,在效率上存在指數級別的差異 本文主要針對大量資料的遍歷,當資料量小時 可以隨意選擇一種遍歷方法。例項...