1

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

  1. 我只需要从表中导出数据列表,而不是全部。我的客户将给我需要从源移动到目标的 ID。我在主表中有大约 3000 条记录,在子表中也是如此。我期望的是,只有 300 条记录要移动。
  2. 如果记录存在于目的地,则客户端将指示是否忽略或逐个覆盖。90% 的情况下,我们需要忽略记录而不覆盖,而是将记录记录在日志文件中。

请用最好的方法帮助我。我想过使用带有查询选项的 BCP 来过滤数据,但是在导入时,如何绕过插入现有记录?如果需要,我该如何覆盖?

4

1 回答 1

1

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

我要做的是。. .

  1. 在源数据库上创建一个表,这将存储您需要移动的行的 ID。您现在可以 BCP 出您需要的行。
  2. 在目标数据库上,创建一个新的 Work In Progress 表,并对其中的行进行 BCP。
  3. 在那里,您可以编写一个脚本来决定 WIP 行是否进入目标表。

希望这可以帮助。

更新

我所说的在制品 (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),将该行插入到目标表中,使用SCOPE_IDENTITY获取新插入行的 id。现在您有了旧 ID 和新 ID,您可以创建一个插入语句,该语句将为详细信息行插入语句,例如 . . .

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

希望这会有所帮助[如果它对您有所帮助,您可以投票赞成这个答案,即使它不是您要选择的答案:)]

谢谢
BW

于 2010-04-07T12:06:17.253 回答