叮当乱响的小铃铛 发表于 2024-10-22 02:03:58

第39篇 sqlserver同步两张表,保持数据一致

MERGE同步两个表, 根据与源表的JOIN 条件,来通过插入、更新和删除目标表行,达到2张表数据一致。
MERGE 语法:
MERGE TOP (value) <target_table>
USING <table_source>   
ON <merge_search_condition>
        [ WHEN MATCHED [ AND <clause_search_condition> ]
                THEN <merge_matched> ]
        [ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
                THEN <merge_not_matched> ]
        [ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
                THEN <merge_matched> ]
        [ <output_clause> ]
        [ OPTION ( <query_hint> ) ]      
;在SQL中,创建2张表,.和.,也就是将来你Merge的2张表。
IF OBJECT_ID('Target_Data') IS NOT NULL
                DROP TABLE .
        CREATE TABLE .
        (
                INT PRIMARY KEY NOT NULL,
                NVARCHAR(10) NULL,
                NVARCHAR(10) NULL,
                NVARCHAR(10) NULL,
                NVARCHAR(10) NULL,
                NVARCHAR(10) NULL,
                NVARCHAR(10) NULL,
                NVARCHAR(10) NULL,
                NVARCHAR(10) NULL
        )
GO

IF OBJECT_ID('Source_Data') IS NOT NULL
                DROP TABLE .
        CREATE TABLE .
        (
                INT PRIMARY KEY NOT NULL,
                NVARCHAR(10) NULL,
                NVARCHAR(10) NULL,
                NVARCHAR(10) NULL,
                NVARCHAR(10) NULL,
                NVARCHAR(10) NULL,
                NVARCHAR(10) NULL,
                NVARCHAR(10) NULL,
                NVARCHAR(10) NULL
        )
GO此时,在.表中,准备一些临时数据:
IF NOT EXISTS(--这个判断,是为了不想添加重复数据。
        SELECT TOP 1 1 FROM .
        WHERE
                = AND
                = AND
                = AND
                = AND
                = AND
                = AND
                = AND
                = AND
                =
)
INSERT INTO .
        (,,,,,,,,)
VALUES
(1,N'A000',N'a000',N'B000',N'b000',N'C000',N'c000',N'D000',N'd000'),
(2,N'A001',N'a001',N'B001',N'b001',N'C001',N'c001',N'D001',N'd001'),
(3,N'A002',N'a002',N'B002',N'b002',N'C002',N'c002',N'D002',N'd002'),
(4,N'A003',N'a003',N'B003',N'b003',N'C003',N'c003',N'D003',N'd003'),
(5,N'A004',N'a004',N'B004',N'b004',N'C004',N'c004',N'D004',N'd004'),
(6,N'A005',N'a005',N'B005',N'b005',N'C005',N'c005',N'D005',N'd005'),
(7,N'A006',N'a006',N'B006',N'b006',N'C006',N'c006',N'D006',N'd006'),
(8,N'A007',N'a007',N'B007',N'b007',N'C007',N'c007',N'D007',N'd007')
GO查看.和.2张表数据:

接下来,我们把.数据同步至Target_Data表中,方法可有2种方案,
方案1,INSERT INTO . SELECT ... FROM .
方案2,使用Merge。
其中方案1,一次性确保成功,数据量小,整个过程中,服务器正常运行,网络正常,Target_Data没有Source_Data数据无任何故障突发生。
IF NOT EXISTS(--这个判断,是为了不想数据被重复添加。
        SELECT TOP 1 1 FROM .
        WHERE
                =
                --AND
                -- = AND
                -- = AND
                -- = AND
                -- = AND
                -- = AND
                -- = AND
                -- = AND
                -- =
)
INSERT INTO .(,,,,,,,,)
SELECT ,,,,,,,,
FROM .
GO执行SQL代码后,可以看看2张表的数据情况:

根据Select结果来看,说明方案1执行成功。
而方案2,它可以更加实用与灵活,插入、更新和删除操作。可重复执行,可以单独某一个字段。
为了练习方案2,得先做一个动作,执行下面SQL代码,清除清除.数据。
TRUNCATE TABLE .
GO
编写Microsoft sql server MERGE:
MERGE INTO . AS TARGET
USING . AS SOURCE
ON TARGET. = SOURCE. --基本条件,即是相同。当然在这里还可以添加其他条件 AND ...
WHEN MATCHED THEN
        UPDATE SET
                TARGET. = SOURCE.,
                TARGET. = SOURCE.,
                TARGET. = SOURCE.,
                TARGET. = SOURCE.,
                TARGET. = SOURCE.,
                TARGET. = SOURCE.,
                TARGET. = SOURCE.,
                TARGET. = SOURCE.
WHEN NOT MATCHED BY TARGET THEN
        INSERT (
                ,
                ,
                ,
                ,
                ,
                ,
                ,
                ,
               
        )
        VALUES (
                SOURCE.,
                SOURCE.,
                SOURCE.,
                SOURCE.,
                SOURCE.,
                SOURCE.,
                SOURCE.,
                SOURCE.,
                SOURCE.
                )
--WHEN NOT MATCHED BY SOURCE THEN --将TARGE表数据删除 (注意,这步!把数据删除了。)
--    DELETE
;
Go根据ON条件,如果.没存在,而.存在,它会把数据INSERT。
还有,就是更新,它把.其它字段数据更新至.表中。此要看你写的更新语句的写法了。
运行上面Merge代码,2张表数据结果一样。select 2张表的结果就不帖出来,略过。
现在练习上面代码行149和150代码,把它由注释改为正常代码,这里的删除,它是删除.的数据,是.中没有的数据。
练习,先在.添加2笔数据。让步2张表的数据产生差异。
INSERT INTO .
        (,,,,,,,,)
VALUES
(888,N'A888',N'a888',N'B888',N'b888',N'C888',N'c888',N'D888',N'd888'),
(999,N'A999',N'a999',N'B999',N'b999',N'C999',N'c999',N'D999',N'd999')
GO运行代码之后,此时,看看2张表的结果

可以在.表中,高亮的2行数据,即是刚刚添加的。
再去运行Merge代码,它会把上面2笔数据行删除。
最终结果,2张表的数据相同。


来源:https://www.cnblogs.com/chenshibao/p/18491616
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 第39篇 sqlserver同步两张表,保持数据一致