【发布时间】:2016-05-06 01:32:26
【问题描述】:
我在使用 SQL Server 2008 R2 的同一服务器上的 2 个不同数据库上有 2 个具有相同架构的表。 一张表会更频繁地更新数据。
现在需要使这两个表保持同步。这可以作为一个夜间过程发生。 实现同步的最佳方法是什么。过程?
【问题讨论】:
标签: database tsql synchronization sql-server-2008-r2
我在使用 SQL Server 2008 R2 的同一服务器上的 2 个不同数据库上有 2 个具有相同架构的表。 一张表会更频繁地更新数据。
现在需要使这两个表保持同步。这可以作为一个夜间过程发生。 实现同步的最佳方法是什么。过程?
【问题讨论】:
标签: database tsql synchronization sql-server-2008-r2
使用 MERGE 是您的最佳选择。您可以控制每个条件。当匹配然后,当不匹配然后等等。
示例 A:事务使用 - 表变量 - 否
DECLARE @Source TABLE (ID INT)
DECLARE @Target TABLE (ID INT)
INSERT INTO @Source (ID) VALUES (1),(2),(3),(4),(5)
BEGIN TRANSACTION
MERGE @Target AS T
USING @Source AS S
ON (S.ID = T.ID)
WHEN NOT MATCHED THEN
INSERT (ID) VALUES (S.ID);
ROLLBACK TRANSACTION
SELECT 'FAIL' AS Test,*
FROM @Target
示例 B:事务使用 - 物理表
CREATE TABLE SRC (ID INT);
CREATE TABLE TRG (ID INT);
INSERT INTO SRC (ID) VALUES (1),(2),(3),(4),(5)
BEGIN TRANSACTION
MERGE TRG AS T
USING SRC AS S
ON (S.ID = T.ID)
WHEN NOT MATCHED THEN
INSERT (ID) VALUES (S.ID);
ROLLBACK TRANSACTION
SELECT 'FAIL' AS Test,*
FROM TRG
示例 C:事务使用 - Tempdb(本地和全局)
CREATE TABLE #SRC (ID INT);
CREATE TABLE #TRG (ID INT);
INSERT INTO #SRC (ID) VALUES (1),(2),(3),(4),(5)
BEGIN TRANSACTION
MERGE #TRG AS T
USING #SRC AS S
ON (S.ID = T.ID)
WHEN NOT MATCHED THEN
INSERT (ID) VALUES (S.ID);
ROLLBACK TRANSACTION
SELECT 'FAIL' AS Test,*
FROM #TRG
【讨论】:
您可能可以使用 sql server 的 tablediff.exe 命令行实用程序。它可以对两个表进行逐表、一次性的比较,并自动生成sql,以便您将dest同步到源。
还有一个围绕它的 GUI 包装器http://code.google.com/p/sqltablediff/,这使工作更加轻松。它会为你生成命令行。
然后可以创建一个定时任务运行命令行,然后执行生成的sql脚本。
【讨论】:
您可以从不同的数据库中进行选择,并使用光标循环选择的数据。在该游标中,您可以执行一些逻辑并从目标表中更新或删除。
SQL 2008 还有一个不错的新 MERGE 语句,您可以使用它在一个 T-SQL 查询中选择/插入/更新。 http://technet.microsoft.com/en-us/library/bb510625%28v=sql.105%29.aspx
对于更复杂的过程,我使用第一个选项。对于更直接的同步任务,我使用第二个选项。
作为额外选项,还有服务器集成服务 (SSIS): http://blogs.msdn.com/b/jorgepc/archive/2010/12/07/synchronize-two-tables-using-sql-server-integration-services-ssis-part-i-of-ii.aspx
【讨论】: