當前位置:成語大全網 - 書法字典 - 如何用SQL遍歷整個表

如何用SQL遍歷整個表

在數據庫開發過程中,經常會遇到遍歷數據表的情況。說到遍歷表,我們的第壹印象可能是使用遊標。使用遊標雖然直觀易懂,但不符合面向集合的操作原理,性能低於面向集合的。當然,從面向集合操作的角度來看,也有兩種遍歷表的方式。綜上所述,遍歷表有幾種方法。

使用光標

使用表變量

使用臨時表

我的要求是在HR.Employees表中添加壹個列fullname,取值為firstname+lastname。

-需求是添加壹個fullname列,值為firstname+lastname alter tablehr。雇員添加全名nvarchar(30)null;去

原始效果如下圖。

這個需求可以在sql語句中解決,如下面的代碼所示。但是為了演示表的遍歷,我還是用這三種方式來實現。

使用TSQLFundamentals2008group date HR . Employees SET full name = first name+' '+last name;

使用光標

使用光標的代碼比較復雜,可以總結為以下幾個步驟:聲明光標、打開光標、使用光標、關閉光標、釋放光標。示例代碼如下。

-方法1:遊標聲明變量聲明

@empid為INT,@firstname為NVARCHAR(10),@lastname為NVARCHAR(20);

-declare cursor declare c _ employees遊標快進for。

選擇員工id、名字、姓氏

按員工id排序的人力資源員工;

開放C _員工;-從c _ employeesto @ empid,@ firstname,@ lastnameWHILE @@FETCH_STATUS=0BEGIN

-操作

更新HR . Employees SET full name = @ first name+' '+@ last name其中empid = @ empid

-做個記錄。

將NEXT從C_Employees提取到@empid,@firstname,@ lastnameEND - close光標關閉C _ Employees-釋放遊標DEALLOCATE C _ Employees

運行腳本,效果如下所示。

正如妳所看到的,我們已經達到了預期的效果。

使用表變量

因為使用遊標有性能問題,違背了集合定向的思想,所以我們有必要用集合定向的思想來尋找更好的解決方案。下面的方法是用表變量實現的,代碼如下。

1-方法2:使用表變量

2-聲明表變量

3聲明@temp表

4 (

5 empid INT,

6名NVARCHAR(10),

7姓NVARCHAR(20)

8 );

10-將源表中的數據插入表變量。

11插入到@temp(empid,firstname,lastname)

12從HR.Employees中選擇empid,firstname,lastname

13按empid下單;

14

15-聲明變量

16申報

17 @empid AS INT,

18 @ first name AS NVARCHAR(10),

19 @ last name AS NVARCHAR(20);

20

存在時為21(從@temp中選擇empid)

22開始

23-top 1也可以。

24設置行數1

25 SELECT @empid= empid,@firstname= firstname,@ lastname = lastname FROM @ temp

26 UPDATE HR . Employees SET full name = @ first name+' '+@ last name其中empid = @ empid

27設置行計數0

28

29 DELETE FROM @temp其中empid = @ empid

30結束

使用臨時表

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

1-方法3:使用臨時表

2-創建臨時表

3如果OBJECT _ ID(' tempdb . dbo . # temp employees ',' U ')不為NULL,則刪除表dbo。#臨時員工;

4走

6選擇員工id、名字、姓氏

7成dbo。臨時員工數量

8名來自人力資源部員工

9按empid排序;

10

11 -從dbo中選擇*#臨時員工;

12

13-聲明變量

14申報

15 @empid AS INT,

16 @ first name AS NVARCHAR(10),

17 @ last name AS NVARCHAR(20);

18

19 WHILE EXISTS(從dbo中選擇empid。#臨時員工)

20開始

21-頂1也可以。

22設置行數1

23 SELECT @empid= empid,@firstname= firstname,@lastname= lastname FROM dbo。#臨時員工;

24 UPDATE HR . Employees SET full name = @ first name+' '+@ last name其中empid = @ empid

25設置行計數0

26

27從dbo中刪除。#tempemployees,其中empid = @ empid

28結束

當然,效果是壹樣的。