代码之家  ›  专栏  ›  技术社区  ›  Herb Caudill

如何有效地将数据与远程数据库进行比较?

  •  2
  • Herb Caudill  · 技术社区  · 15 年前

    我需要用在远程数据库(也就是在同一本地网络上的不同服务器上的SQL Server)中所做的更改来更新SQL Server中的联系人数据库。我不能对远程数据库做任何更改,这是一个商业产品。我使用链接服务器连接到远程数据库。两个表都包含大约20万行。

    我现在的逻辑非常简单。[下面是简化的伪SQL]

    /* Get IDs of new contacts into local temp table */
    
    Select remote.ID into #NewContactIDs
    From Remote.Contacts remote
    Left Join Local.Contacts local on remote.ID=local.ID
    Where local.ID is null
    
    /* Get IDs of changed contacts */
    
    Select remote.ID into #ChangedContactIDs
    From Remote.Contacts remote
    Join Local.Contacts local on remote.ID=local.ID
    Where local.ModifyDate < remote.ModifyDate
    
    /* Pull down all new or changed contacts */
    
    Select ID, FirstName, LastName, Email, ...
    Into #NewOrChangedContacts
    From Remote.Contacts remote
    Where remote.ID in (
            Select ID from #NewContactIDs 
            union 
            Select ID from #ChangedContactIDs
        )
    

    当然,在电线上做那些连接和比较会让我很难受。我相信有更好的方法-建议?

    2 回复  |  直到 13 年前
        1
  •  3
  •   Matthew Flynn    15 年前

    考虑在本地系统中维护lastcompareTimestamp(上次进行比较时)。使用modifydates>lastcmpareTimeStamp获取所有远程记录,并将它们放入本地临时表中。从那里本地与他们合作。

        2
  •  0
  •   onupdatecascade    15 年前

    最后一次比较日期是个好主意

    我使用的另一个非常成功的方法是ssis(尽管它有一个学习曲线,如果不经常做这种类型的事情,可能会造成过度杀伤力):

    做一个包裹

    为两个表中的每一个设置数据源。如果您希望进行大量的更改,则拉取整个表;如果您只希望进行增量更改,则按mod date筛选。确保结果是有序的

    两个漏斗都形成一个完整的外部连接

    将联接结果拆分为三个存储桶:未更改、已更改、新

    丢弃未更改的记录,将新记录发送到插入目标,并将更改的记录发送到基于SQL的更新的临时表,或者(对于少数行)使用参数化更新语句的OLEDB命令。

    或者,如果在SQL Server 2008上,则使用合并