2011年3月4日 星期五

SQL Server 2008 T-SQL 新語法介紹 - Merge (效能改善)

        最近在重新修正我之前寫的一個基金(Data Mining)預測的程式時,由於資料來源都是我寫的程式自動到網路上捉取後並存入資料庫中,但是在存入前我都會檢查資料是否存在,如果存在就更新,不存在就新增,但由於資料量過大而且一來需要進行二個資料庫的動作,所以希望針對這部份進行改良,所以我就利用了SQL Server 2008推出的新語法Merge來進行改善。

        T-SQL Merge語法主要是由SQL Server 2008所推出的新語法,可以判斷資料是否存在,動態選擇Insert或Update語法進行處理,進而同步二個表格之間的資料,而目前大部份的範例都是說明如何同步二個表格,但是根據我的需求,好像都行不通,後來終於讓我試出來了,而且原本二個程序的語法變成一個程序,實測下感覺速度快了很多,所以在此提供。

原本的語法,先查詢此基金的編號與日期是否存在,如果存在則更新基金的淨值,不存在的話就新增基金當天的淨值資料。

select 1 from fund_value
where fund_sn = 2062 and gdate_111 = '2008/12/30'

新增語法:

insert into fund_value(fund_sn, gdate, nvalue)
values(2062, '2008/12/30',5.7602);

更新語法:

update fund_value
set nvalue = 5.701
where fund_sn = 2062 and gdate_111 = '2008/12/30'

利用SQL Server 2008 提供的Merge語法來將上面的三段語法進行整合,最後只要透過下列的語法即可完成:

MERGE INTO fund_value as t_fv  --Target
USING (select 2062 fund_sn, '2008/12/30' gdate_111) s_fv  --Source
ON t_fv.fund_sn = s_fv.fund_sn and t_fv.gdate_111 = s_fv.gdate_111
WHEN MATCHED THEN
 update set t_fv.nvalue = 5.76003
WHEN NOT MATCHED THEN
 insert(fund_sn, gdate, nvalue) values(2062, '2008/12/30',5.7602);

1 則留言: