使用MERGE同步2个表

dev*_*ead 2 sql sql-server merge

我的任务是同步2个表(两者都相同).它们各有60列.表A是最初填充的主表.我需要创建一个存储过程(完成),它将合并这两个表,并在调用时用相同的确切数据(更新,插入,删除)填充它们.我如何在SQL中使用MERGE函数来实现这一目标?我已经查看了MSDN文档和类似于technet的文档,但我对入门感到困惑.我是否需要指定需要合并的每个字段?或者这是一个我想要执行此操作的简单电话?

two*_*rse 6

以下是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)
;
Run Code Online (Sandbox Code Playgroud)

你也可以使用 WHEN NOT MATCHED BY SOURCE


小智 6

超过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);
Run Code Online (Sandbox Code Playgroud)