使用游標
使用表變數
使用臨時表
我的需求是:針對hr.employees表,新增一列fullname,並取值firstname+lastname。
-- 需求是,新增一列fullname,取值firstname+lastnamealter 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=0begin
-- 操作
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 );
10 -- 將源表中的資料插入到表變數中
11 insert into @temp(empid, firstname, lastname )
12 select empid,firstname,lastname from hr.employees
13 order by empid;
15 -- 宣告變數
16 declare
17 @empid as int,
18 @firstname as nvarchar(10),
19 @lastname as nvarchar(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
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
6 select empid,firstname,lastname
7 into dbo.#tempemployees
8 from hr.employees
9 order by empid;
11 --select * from dbo.#tempemployees;
13 -- 宣告變數
14 declare
15 @empid as int,
16 @firstname as nvarchar(10),
17 @lastname as nvarchar(20);
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
27 delete from dbo.#tempemployees where empid=@empid;
28 end
當然,實現的效果都是一樣的。
如何用sql語句去掉列的自增長 identity
如何用sql語句去掉列的自增長 identity 無法通過alter把現有自增字段改為非自增 比如alter table a alter id int,自增屬性不會去掉 通過修改系統表可以做到 此法可能有不可預知的結果,慎之.sp configure allow updates 1 go recon...
如何用SQL動態擷取字串的長度
我們都知道,sql擷取字串的固定長度,可以有sub 函式,rigth 函式,或者left 函式.如果擷取的字串是動態的乙個字段,那麼顯然,以上3個函式是不適用的.那麼如何動態的擷取字串的長度呢?比如 乙個表裡面有這麼validdate欄位,它的資料是這樣的形式插進去的,1,年 2,年 6,月 12,...
MySQL如何刪除 sql開頭的臨時表
巡檢時發現伺服器磁碟空間不足,通過檢視大檔案進行篩選是發現有幾個 sql開頭的檔案,且存在超過100g及10g以上的檔案。如果mysql在乙個 alter table操作 algorithm inplace 的中間退出,那麼可能會留下乙個占用系統空間的臨時表。例如,在對一張表 大表 新增索引時中途中...