北京北大青鳥ACCP學(xué)術(shù)部提供:Microsoft SQL Server 2008將包含用于合并兩個行集(rowset)數(shù)據(jù)的新句法。根據(jù)一個源數(shù)據(jù)表對另一個數(shù)據(jù)表進(jìn)行確定性的插入、更新和刪除這樣復(fù)雜的操作,運(yùn)用新的MERGE語句,開發(fā)者只需使用一條命令就可以完成。
在對兩個表進(jìn)行信息同步時,有三步操作必須要進(jìn)行。首先我們要處理任何需要插入目標(biāo)數(shù)據(jù)表的新行。其次是處理需要更新的已存在的行。最后要刪除不再使用的舊行。這個過程中需要維護(hù)大量重復(fù)的邏輯,并可能導(dǎo)致微妙的錯誤。
值得我們大家主意的是,這個語句將上述的多個操作步驟合并成單一語句。以下是示例:
以下是引用的片斷:
merge [target] t
using [source] s on t.id = s.id
when matched then update t.name = s.name, t.age = s.age -- use "rowset1"
when not matched then insert values(id,name,age) -- use "rowset2"
when source not matched then delete; -- use "rowset3"
大家可以看到,具體的操作是根據(jù)后面的聯(lián)合(join)的解析結(jié)果來確定的。在這個示例中,假如目標(biāo)和源數(shù)據(jù)表有匹配的行,就實(shí)行更新操作。如果沒有,就實(shí)行插入或者刪除操作來使目標(biāo)數(shù)據(jù)表和源數(shù)據(jù)表保持一致。
這個新句法的一個精妙之處是它在處理更新時的確定性。在使用標(biāo)準(zhǔn)的UPDATE句法和聯(lián)合時,可能有超過一個源行跟目標(biāo)行匹配。在此情況下,無法預(yù)料更新操作會采用哪個源行的數(shù)據(jù)。
而我們在使用MERGE句法時,假如存在多處匹配,它會拋出一個錯誤。這就需要開發(fā)者主意,要達(dá)到預(yù)想的目標(biāo),當(dāng)前的聯(lián)合條件還不夠十分明確。