在資料庫開發過程中,我們經常會碰到要遍歷資料表的情形,一提到遍歷表,我們第一印象可能就想到使用游標,使用游標雖然直觀易懂,但是它不符合面向集合操作的原則,而且效能也比面向集合低。當然,從面向集合操作的角度出發,也有兩種方法可以進行遍歷表的操作,總結起來,遍歷表有下面幾種方法。
使用游標
使用表變數
使用臨時表
我的需求是:針對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
臨時表也可以實現表變數的功能,所以我們也可以使用臨時表來實現這個需求,**如下。
1 -- 方法3:使用臨時表當然,實現的效果都是一樣的。2 -- 建立臨時表
3 if object_id('tempdb.dbo.#tempemployees','u') is not null drop table dbo.#tempemployees;
4 go
5 6 select empid,firstname,lastname
7 into dbo.#tempemployees
8 from hr.employees
9 order by empid;
10 11 --select * from dbo.#tempemployees;
12 13 -- 宣告變數
14 declare
15 @empid as int,
16 @firstname as nvarchar(10),
17 @lastname as nvarchar(20);
18
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
26
27 delete from dbo.#tempemployees where empid=@empid;
28 end
SQL Server遍歷表的幾種方法
原文 sql server遍歷表的幾種方法 在資料庫開發過程中,我們經常會碰到要遍歷資料表的情形,一提到遍歷表,我們第一印象可能就想到使用游標,使用游標雖然直觀易懂,但是它不符合面向集合操作的原則,而且效能也比面向集合低。當然,從面向集合操作的角度出發,也有兩種方法可以進行遍歷表的操作,總結起來,遍...
SQL Server遍歷表的幾種方法
閱讀目錄 在資料庫開發過程中,我們經常會碰到要遍歷資料表的情形,一提到遍歷表,我們第一印象可能就想到使用游標,使用游標雖然直觀易懂,但是它不符合面向集合操作的原則,而且效能也比面向集合低。當然,從面向集合操作的角度出發,也有兩種方法可以進行遍歷表的操作,總結起來,遍歷表有下面幾種方法。使用游標 使用...
SQL Server中幾種遍歷方式比較
sql遍歷解析 在sql的儲存過程,函式中,經常需要使用遍歷 遍歷table 其中游標 臨時表等遍歷方法很常用。面對小資料量,這幾種遍歷方法均可行,但是面臨大資料量時,就需要擇優選擇,不同的遍歷方法,在效率上存在指數級別的差異 本文主要針對大量資料的遍歷,當資料量小時 可以隨意選擇一種遍歷方法。例項...