不幸的是,BCPing 进入一个表是一个全有或全无的交易,你不能选择要引入的行。
我要做的是。. .
- 在源数据库上创建一个表,这将存储您需要移动的行的 ID。您现在可以 BCP 出您需要的行。
- 在目标数据库上,创建一个新的 Work In Progress 表,并对其中的行进行 BCP。
- 在那里,您可以编写一个脚本来决定 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