简单练习Microsoft SQL Server MERGE同步两个表

打印 上一主题 下一主题

主题 1773|帖子 1773|积分 5319

MERGE同步两个表, 根据与源表的JOIN 条件,来通过插入、更新和删除目标表行,到达2张表数据同等。
MERGE 语法:

 
  1. MERGE TOP (value) <target_table>
  2. USING <table_source>   
  3. ON <merge_search_condition>  
  4.     [ WHEN MATCHED [ AND <clause_search_condition> ]  
  5.         THEN <merge_matched> ]
  6.     [ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]  
  7.         THEN <merge_not_matched> ]  
  8.     [ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]  
  9.         THEN <merge_matched> ]
  10.     [ <output_clause> ]  
  11.     [ OPTION ( <query_hint> ) ]      
  12. ;
复制代码
Source Code 
在SQL中,创建2张表,[dbo].[Target_Data]和[dbo].[Source_Data],也就是未来你Merge的2张表。

  1. IF OBJECT_ID('Target_Data') IS NOT NULL
  2.         DROP TABLE [dbo].[Target_Data]
  3.     CREATE TABLE [dbo].[Target_Data]
  4.     (
  5.         [ID] INT PRIMARY KEY NOT NULL,
  6.         [Column1] NVARCHAR(10) NULL,
  7.         [Column2] NVARCHAR(10) NULL,
  8.         [Column3] NVARCHAR(10) NULL,
  9.         [Column4] NVARCHAR(10) NULL,
  10.         [Column5] NVARCHAR(10) NULL,
  11.         [Column6] NVARCHAR(10) NULL,
  12.         [Column7] NVARCHAR(10) NULL,
  13.         [Column8] NVARCHAR(10) NULL
  14.     )
  15. GO
  16. IF OBJECT_ID('Source_Data') IS NOT NULL
  17.         DROP TABLE [dbo].[Source_Data]
  18.     CREATE TABLE [dbo].[Source_Data]
  19.     (
  20.         [ID] INT PRIMARY KEY NOT NULL,
  21.         [Column1] NVARCHAR(10) NULL,
  22.         [Column2] NVARCHAR(10) NULL,
  23.         [Column3] NVARCHAR(10) NULL,
  24.         [Column4] NVARCHAR(10) NULL,
  25.         [Column5] NVARCHAR(10) NULL,
  26.         [Column6] NVARCHAR(10) NULL,
  27.         [Column7] NVARCHAR(10) NULL,
  28.         [Column8] NVARCHAR(10) NULL
  29.     )
  30. GO
复制代码
Source Code 
此时,在[dbo].[Source_Data]表中,预备一些临时数据:

  1. IF NOT EXISTS(  --这个判断,是为了不想添加重复数据。
  2.     SELECT TOP 1 1 FROM [dbo].[Source_Data]
  3.     WHERE
  4.         [ID] = [ID] AND
  5.         [Column1] = [Column1] AND
  6.         [Column2] = [Column2] AND
  7.         [Column3] = [Column3] AND
  8.         [Column4] = [Column4] AND
  9.         [Column5] = [Column5] AND
  10.         [Column6] = [Column6] AND
  11.         [Column7] = [Column7] AND
  12.         [Column8] = [Column8]
  13. )
  14. INSERT INTO [dbo].[Source_Data]
  15.     ([ID],[Column1],[Column2],[Column3],[Column4],[Column5],[Column6],[Column7],[Column8])
  16. VALUES
  17. (1,N'A000',N'a000',N'B000',N'b000',N'C000',N'c000',N'D000',N'd000'),
  18. (2,N'A001',N'a001',N'B001',N'b001',N'C001',N'c001',N'D001',N'd001'),
  19. (3,N'A002',N'a002',N'B002',N'b002',N'C002',N'c002',N'D002',N'd002'),
  20. (4,N'A003',N'a003',N'B003',N'b003',N'C003',N'c003',N'D003',N'd003'),
  21. (5,N'A004',N'a004',N'B004',N'b004',N'C004',N'c004',N'D004',N'd004'),
  22. (6,N'A005',N'a005',N'B005',N'b005',N'C005',N'c005',N'D005',N'd005'),
  23. (7,N'A006',N'a006',N'B006',N'b006',N'C006',N'c006',N'D006',N'd006'),
  24. (8,N'A007',N'a007',N'B007',N'b007',N'C007',N'c007',N'D007',N'd007')
  25. GO
复制代码
Source Code
查看[dbo].[Source_Data]和[dbo].[Target_Data]2张表数据:

 
接下来,我们把[dbo].[Source_Data]数据同步至Target_Data表中,方法可有2种方案,
方案1,INSERT INTO [dbo].[Target_Data] SELECT ... FROM [dbo].[Source_Data]
方案2,使用Merge。

其中方案1,一次性确保成功,数据量小,整个过程中,服务器正常运行,网络正常,Target_Data没有Source_Data数据无任何故障突发生。

  1. IF NOT EXISTS(  --这个判断,是为了不想数据被重复添加。
  2.     SELECT TOP 1 1 FROM [dbo].[Target_Data]
  3.     WHERE
  4.         [ID] = [ID]
  5.         --AND
  6.         --[Column1] = [Column1] AND
  7.         --[Column2] = [Column2] AND
  8.         --[Column3] = [Column3] AND
  9.         --[Column4] = [Column4] AND
  10.         --[Column5] = [Column5] AND
  11.         --[Column6] = [Column6] AND
  12.         --[Column7] = [Column7] AND
  13.         --[Column8] = [Column8]
  14. )
  15. INSERT INTO [dbo].[Target_Data]([ID],[Column1],[Column2],[Column3],[Column4],[Column5],[Column6],[Column7],[Column8])
  16. SELECT [ID],[Column1],[Column2],[Column3],[Column4],[Column5],[Column6],[Column7],[Column8]
  17. FROM [dbo].[Source_Data]
  18. GO
复制代码
Source Code 
执行SQL代码后,可以看看2张表的数据情况:

根据Select结果来看,说明方案1执行成功。
而方案2,它可以更加实用与灵活,插入、更新和删除操纵。可重复执行,可以单独某一个字段。
为了练习方案2,得先做一个动作,执行下面SQL代码,扫除扫除[dbo].[Target_Data]数据。
  1. TRUNCATE TABLE [dbo].[Target_Data]
  2. GO
复制代码
Source Code

 
编写Microsoft sql server MERGE:

 
  1. MERGE INTO [dbo].[Target_Data] AS TARGET
  2. USING [dbo].[Source_Data] AS SOURCE
  3. ON TARGET.[ID] = SOURCE.[ID] --基本条件,即是相同。当然在这里还可以添加其他条件 AND ...
  4. WHEN MATCHED THEN
  5.     UPDATE SET
  6.         TARGET.[Column1] = SOURCE.[Column1],
  7.         TARGET.[Column2] = SOURCE.[Column2],
  8.         TARGET.[Column3] = SOURCE.[Column3],
  9.         TARGET.[Column4] = SOURCE.[Column4],
  10.         TARGET.[Column5] = SOURCE.[Column5],
  11.         TARGET.[Column6] = SOURCE.[Column6],
  12.         TARGET.[Column7] = SOURCE.[Column7],
  13.         TARGET.[Column8] = SOURCE.[Column8]
  14. WHEN NOT MATCHED BY TARGET THEN
  15.     INSERT (
  16.         [ID],
  17.         [Column1],
  18.         [Column2],
  19.         [Column3],
  20.         [Column4],
  21.         [Column5],
  22.         [Column6],
  23.         [Column7],
  24.         [Column8]
  25.     )
  26.     VALUES (
  27.         SOURCE.[ID],
  28.         SOURCE.[Column1],
  29.         SOURCE.[Column2],
  30.         SOURCE.[Column3],
  31.         SOURCE.[Column4],
  32.         SOURCE.[Column5],
  33.         SOURCE.[Column6],
  34.         SOURCE.[Column7],
  35.         SOURCE.[Column8]
  36.         )
  37. --WHEN NOT MATCHED BY SOURCE THEN --将TARGE表数据删除 (注意,这步!把数据删除了。)
  38. --    DELETE
  39. ;
  40. Go
复制代码
Source Code根据ON条件,假如[dbo].[Target_Data]没存在,而[dbo].[Source_Data]存在,它会把数据INSERT。
还有,就是更新,它把[dbo].[Source_Data]别的字段数据更新至[dbo].[Target_Data]表中。此要看你写的更新语句的写法了。

运行上面Merge代码,2张表数据结果一样。select 2张表的结果就不帖出来,略过。

现在练习上面代码行149和150代码,把它由注释改为正常代码,这里的删除,它是删除[dbo].[Target_Data]的数据,是[dbo].[Source_Data]中没有的数据。

练习,先在[dbo].[Target_Data]添加2笔数据。让步2张表的数据产生差异。

  1. INSERT INTO [dbo].[Target_Data]
  2.     ([ID],[Column1],[Column2],[Column3],[Column4],[Column5],[Column6],[Column7],[Column8])
  3. VALUES
  4. (888,N'A888',N'a888',N'B888',N'b888',N'C888',N'c888',N'D888',N'd888'),
  5. (999,N'A999',N'a999',N'B999',N'b999',N'C999',N'c999',N'D999',N'd999')
  6. GO
复制代码
Source Code 
运行代码之后,此时,看看2张表的结果

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

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表