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

  • 第39篇 sqlserver同步两张表,保持数据一致已关闭评论
  • 4 次浏览
  • A+
所属分类:.NET技术
摘要

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

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张表,[dbo].[Target_Data]和[dbo].[Source_Data],也就是将来你Merge的2张表。

IF OBJECT_ID('Target_Data') IS NOT NULL 		DROP TABLE [dbo].[Target_Data] 	CREATE TABLE [dbo].[Target_Data] 	( 		[ID] INT PRIMARY KEY NOT NULL, 		[Column1] NVARCHAR(10) NULL, 		[Column2] NVARCHAR(10) NULL, 		[Column3] NVARCHAR(10) NULL, 		[Column4] NVARCHAR(10) NULL, 		[Column5] NVARCHAR(10) NULL, 		[Column6] NVARCHAR(10) NULL, 		[Column7] NVARCHAR(10) NULL, 		[Column8] NVARCHAR(10) NULL 	) GO   IF OBJECT_ID('Source_Data') IS NOT NULL 		DROP TABLE [dbo].[Source_Data] 	CREATE TABLE [dbo].[Source_Data] 	( 		[ID] INT PRIMARY KEY NOT NULL, 		[Column1] NVARCHAR(10) NULL, 		[Column2] NVARCHAR(10) NULL, 		[Column3] NVARCHAR(10) NULL, 		[Column4] NVARCHAR(10) NULL, 		[Column5] NVARCHAR(10) NULL, 		[Column6] NVARCHAR(10) NULL, 		[Column7] NVARCHAR(10) NULL, 		[Column8] NVARCHAR(10) NULL 	) GO 

此时,在[dbo].[Source_Data]表中,准备一些临时数据:

IF NOT EXISTS(  --这个判断,是为了不想添加重复数据。 	SELECT TOP 1 1 FROM [dbo].[Source_Data] 	WHERE  		[ID] = [ID] AND 		[Column1] = [Column1] AND 		[Column2] = [Column2] AND 		[Column3] = [Column3] AND 		[Column4] = [Column4] AND 		[Column5] = [Column5] AND 		[Column6] = [Column6] AND 		[Column7] = [Column7] AND 		[Column8] = [Column8] ) INSERT INTO [dbo].[Source_Data] 	([ID],[Column1],[Column2],[Column3],[Column4],[Column5],[Column6],[Column7],[Column8]) 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 

查看[dbo].[Source_Data]和[dbo].[Target_Data]2张表数据:
第39篇 sqlserver同步两张表,保持数据一致

接下来,我们把[dbo].[Source_Data]数据同步至Target_Data表中,方法可有2种方案,

方案1,INSERT INTO [dbo].[Target_Data] SELECT ... FROM [dbo].[Source_Data]
方案2,使用Merge。

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

IF NOT EXISTS(  --这个判断,是为了不想数据被重复添加。 	SELECT TOP 1 1 FROM [dbo].[Target_Data] 	WHERE  		[ID] = [ID] 		--AND 		--[Column1] = [Column1] AND 		--[Column2] = [Column2] AND 		--[Column3] = [Column3] AND 		--[Column4] = [Column4] AND 		--[Column5] = [Column5] AND 		--[Column6] = [Column6] AND 		--[Column7] = [Column7] AND 		--[Column8] = [Column8] ) INSERT INTO [dbo].[Target_Data]([ID],[Column1],[Column2],[Column3],[Column4],[Column5],[Column6],[Column7],[Column8]) SELECT [ID],[Column1],[Column2],[Column3],[Column4],[Column5],[Column6],[Column7],[Column8] FROM [dbo].[Source_Data] GO 

执行SQL代码后,可以看看2张表的数据情况:

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

根据Select结果来看,说明方案1执行成功。

而方案2,它可以更加实用与灵活,插入、更新和删除操作。可重复执行,可以单独某一个字段。

为了练习方案2,得先做一个动作,执行下面SQL代码,清除清除[dbo].[Target_Data]数据。

TRUNCATE TABLE [dbo].[Target_Data] GO 

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

编写Microsoft sql server MERGE:

MERGE INTO [dbo].[Target_Data] AS TARGET USING [dbo].[Source_Data] AS SOURCE ON TARGET.[ID] = SOURCE.[ID] --基本条件,即是相同。当然在这里还可以添加其他条件 AND ... WHEN MATCHED THEN 	UPDATE SET  		TARGET.[Column1] = SOURCE.[Column1], 		TARGET.[Column2] = SOURCE.[Column2], 		TARGET.[Column3] = SOURCE.[Column3], 		TARGET.[Column4] = SOURCE.[Column4], 		TARGET.[Column5] = SOURCE.[Column5], 		TARGET.[Column6] = SOURCE.[Column6], 		TARGET.[Column7] = SOURCE.[Column7], 		TARGET.[Column8] = SOURCE.[Column8] WHEN NOT MATCHED BY TARGET THEN  	INSERT ( 		[ID], 		[Column1], 		[Column2], 		[Column3], 		[Column4], 		[Column5], 		[Column6], 		[Column7], 		[Column8] 	) 	VALUES ( 		SOURCE.[ID], 		SOURCE.[Column1], 		SOURCE.[Column2], 		SOURCE.[Column3], 		SOURCE.[Column4], 		SOURCE.[Column5], 		SOURCE.[Column6], 		SOURCE.[Column7], 		SOURCE.[Column8] 		) --WHEN NOT MATCHED BY SOURCE THEN --将TARGE表数据删除 (注意,这步!把数据删除了。) --    DELETE ; Go 

根据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张表的数据产生差异。

INSERT INTO [dbo].[Target_Data] 	([ID],[Column1],[Column2],[Column3],[Column4],[Column5],[Column6],[Column7],[Column8]) 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张表的结果
第39篇 sqlserver同步两张表,保持数据一致

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

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