我有一种情况需要将部分数据从一台服务器复制到另一台服务器。表模式完全相同。我需要从源中移动部分数据,这些数据可能在目标表中可用,也可能不在目标表中。我想的解决方案是,使用bcp将数据导出到文本(或.dat)文件,然后将该文件带到目标,因为两者不能同时访问(不同的网络),然后将数据导入到目的地。我需要满足一些条件:
请帮我解决最好的方法。我想过使用带查询选项的BCP过滤数据,但在导入时,如何绕过插入现有记录?如果需要,我该如何覆盖?
答案 0 :(得分:1)
不幸的是,BCPing到表中是一个全有或全无的交易,你不能选择要引入的行。
我要做的是。 。
希望这有帮助。
<强>更新强>
正在进行中(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