SQL Server遍歷表的幾種方法

2021-09-07 17:27:31 字數 4110 閱讀 3455

原文:

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 其中游標 臨時表等遍歷方法很常用。面對小資料量,這幾種遍歷方法均可行,但是面臨大資料量時,就需要擇優選擇,不同的遍歷方法,在效率上存在指數級別的差異 本文主要針對大量資料的遍歷,當資料量小時 可以隨意選擇一種遍歷方法。例項...