天天看點

解析SQL Server 2008中的新語句:MERGE

MicrosoftSQL Server 2008将包含用于合并兩個行集(rowset)資料的新句法。根據一個源資料表對另一個資料表進行确定性的插入、更新和删除這樣複雜的操作,運用新的MERGE語句,開發者隻需使用一條指令就可以完成。 

在對兩個表進行資訊同步時,有三步操作必須要進行。首先我們要處理任何需要插入目标資料表的新行。其次是處理需要更新的已存在的行。最後要删除不再使用的舊行。這個過程中需要維護大量重複的邏輯,并可能導緻微妙的錯誤。 

值得我們大家主意的是,Bob Beauchemin讨論了MERGE語句,這個語句将上述的多個操作步驟合并成單一語句。以下是他給出的示例: 

以下是引用的片斷: 

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"

大家可以看到,具體的操作是根據後面的聯合(join)的解析結果來确定的。在這個示例中,假如目标和源資料表有比對的行,就實行更新操作。如果沒有,就實行插入或者删除操作來使目标資料表和源資料表保持一緻。 

這個新句法的一個精妙之處是它在處理更新時的确定性。在使用标準的UPDATE句法和聯合時,可能有超過一個源行跟目标行比對。在此情況下,無法預料更新操作會采用哪個源行的資料。 

而我們在使用MERGE句法時,假如存在多處比對,它會抛出一個錯誤。這就需要開發者主意,要達到預想的目标,目前的聯合條件還不夠十分明确。

繼續閱讀