2013-02-13 94 views
1

我的任務是同步2個表格(兩者完全相同)。他們每個有60列。表A是最初將填寫的主表。我需要創建一個存儲過程(完成),它將合併這兩個表,並在調用時填充相同的確切數據(更新,插入,刪除)。我如何使用SQL中的MERGE函數來實現這一點?我已經查看了MSDN文檔以及technet上的類似文檔,但是我對入門感到困惑。我是否需要指定我需要合併的每個字段?或者這是一個簡單的電話,我錯過了將執行此操作?使用MERGE同步2個表格

+0

正確,我想同步兩個表...我的研究看起來像MERGE是我想要使用。我可能是錯的,我只是沒有看到任何包含超過60列的表的例子。我只是總體混淆從哪裏開始...我是一個C#開發人員走出我的舒適區... – devHead 2013-02-13 18:01:26

+0

@Sarel:如果你願意,你可以刪除評論;) – 2013-02-13 18:03:11

回答

5

這裏是MERGE語句的一個簡單的例子鏈接:

http://www.simple-talk.com/sql/learn-sql-server/the-merge-statement-in-sql-server-2008/

的基本語法讀作:

MERGE table1 
USING table2 
ON table1.id = table2.id 
WHEN MATCHED THEN 
--Do an update here 
WHEN NOT MATCHED BY TARGET THEN 
--Do an insert here (or a delete) 
; 

您還可以使用WHEN NOT MATCHED BY SOURCE

+0

謝謝,我來看看。 – devHead 2013-02-13 18:20:11

+0

這有助於完成我的任務!不僅幫助減少了超過1小時的同步時間,而且還減少了我使用的最後一種方法! – devHead 2013-02-14 15:49:37

+0

@Don Great,很高興它爲你工作:) – twoleggedhorse 2013-02-14 16:39:12

2

超過60列是一個偉大的數字!當我需要同步2個相同的表我做:

;WITH tbl_to_synch as (
    -- Prepare table to update, 
    Select *,chk = CHECKSUM(*) from [dbo].[tableA] 
) 
MERGE tbl_to_synch as [Target] 
USING (Select *,chk = CHECKSUM(*) from [dbo].[tableB]) as [source] 
ON [Target].key = [source].key 
WHEN MATCHED AND [Target].chk <> [source].chk THEN 
-- UPDATE ONLY row that is changed 
UPDATE 
    SET 
     column01 = [source].[column01] 
     ,column02 = [source].[column01] 
     -- .... 
     ,column59 = [source].[column59] 
     ,column60 = [source].[column59] 

WHEN NOT MATCHED BY TARGET THEN 
    insert (column01, column02, ...,column59,column60) 
    values (column01, column02, ...,column59,column60) 
WHEN NOT MATCHED BY SOURCE THEN DELETE 
-- Show what is changed 
OUTPUT $action, ISNULL(INSERTED.key,DELETED.key); 
+0

喜歡使用CTE來定義目標表。 MERGE語句的速度可以得到巨大的提升,這些語句如果沒有按照源進行匹配。欲瞭解更多信息,請參閱我的答案在https://stackoverflow.com/questions/7626719/sql-server-delete-and-merge-performance/41295187#41295187 – 2017-07-14 05:27:12