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