使用光標
使用表變量
使用臨時表
我的要求是在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結束
當然,效果是壹樣的。