批量复制从一台服务器到另一台服务器

时间:2010-04-07 11:15:23

标签: insert bulkinsert bcp bulk

我有一种情况需要将部分数据从一台服务器复制到另一台服务器。表模式完全相同。我需要从源中移动部分数据,这些数据可能在目标表中可用,也可能不在目标表中。我想的解决方案是,使用bcp将数据导出到文本(或.dat)文件,然后将该文件带到目标,因为两者不能同时访问(不同的网络),然后将数据导入到目的地。我需要满足一些条件:

  1. 我只需要从表中导出数据列表,而不是整数。我的客户将给我需要从源移动到目的地的ID。我在主表中有大约3000条记录,在子表中也是如此。我的期望是,只有300条记录要移动。
  2. 如果目标中存在记录,则客户端将指示是否忽略或覆盖大小写。 90%的情况下,我们需要忽略记录而不进行覆盖,而是将记录记录在日志文件中。
  3. 请帮我解决最好的方法。我想过使用带查询选项的BCP过滤数据,但在导入时,如何绕过插入现有记录?如果需要,我该如何覆盖?

1 个答案:

答案 0 :(得分:1)

不幸的是,BCPing到表中是一个全有或全无的交易,你不能选择要引入的行。

我要做的是。 。

  1. 在源上创建一个表 数据库,这将存储ID 您需要移动的行数。您 现在可以BCP出你的行 需要。
  2. 在目标数据库上,创建 一个新的Work In Progress表,和 BCP那里的行。
  3. 一旦进入那里,你就可以编写一个脚本 这将决定是否 WIP行进入目的地 表,或不。
  4. 希望这有帮助。

    <强>更新

    正在进行中(WIP)表格我不是指#temp表格,你不能将BCP写入临时表格(至少如果可以,我会非常惊讶)。
    我的意思是你创建的表与目标表的结构相同,bcp到那个,将WIP行编写到目标表然后删除WIP表。

    你没有说过你正在使用的RDBMS,假设SQL Server,如下所示(未经验证的代码)。 。

    -- following creates new table with identical schema to destination table
    select * into WIP_Destination from Destination
    where 1 = 0
    
    -- BCP in the rows
    BULK INSERT WIP_Destination from 'BcpFileName.dat'
    
    -- Insert new rows into Destination
    insert into Destination
    Select * from WIP_Destination 
    where not id  in (select id from Destination)
    
    -- Update existing rows in destination
    
    Update Destination 
    set field1 = w.field1, 
        field2 = w.field2, 
        field3 = w.field3, 
        . . . 
    from Destination d inner join WIP_Destination w on d.id = w.id
    
    Drop table WIP_Destination
    

    更新2
    好的,所以你可以插入临时表,我只是试了一下(前几天我没有时间,抱歉)。

    关于主/详细记录的问题(我们现在正在移开原问题的主题,如果我是你,我会为这个主题打开一个新问题,你会得到更多答案而不仅仅是我的

    您可以编写一个SP,逐步浏览要添加的新行 因此,您循环遍历临时表中的行(这些行在源数据库中具有原始ID),将该行插入到Destination表中,使用SCOPE_IDENTITY获取新插入的id行。现在您拥有旧的Id和新ID,您可以创建一个insert语句,它将为详细行插入语句。 。

    insert into Destination_Detail
    select @newId, field1, field2 . . . from #temp_Destination_Detail
    where Id = @oldId
    

    希望这有助于 [如果它已经帮助你被允许提出这个答案,即使它不是你要选择的答案:)

    感谢
    BW