我需要将几个大的CSV文件导入SQL Server 2016 Express。
这些文件通过身份密钥相关联,因为Documents.csv
中的每个项目都由Pkey与Fkey中Lines.csv
中的项目相关联。不允许使用自然键(用于intance文档编号),因为可能存在重复项。
我已使用C#中的SqlBulkCopy
将这些文件导入SQL Server登台表。屏幕截图显示了这些临时表之间的关系:
现在我需要将这些表复制到最后的表中,在这个过程中我需要创建代理键并保留以前的Id和Fkey列。我已经读过这可以通过合并和输出来实现,但我并不完全理解它。
已经尝试了几次并且结果是错误的 - 你可以帮忙吗?
编辑: 这些导入将在任何给定时间由客户多次执行,因此我必须确保与关系没有任何关系。
我使用下面的查询获得了表格Documents and Lines的正确结果。现在的问题是,我如何同时为所有表(Files,DocumentTotals,等等)执行此操作?事实上,Files表与数据库中的所有表有关,这部分让我感到困惑,因为当我执行Documents_staging合并到Documents时,我必须已经执行Files表的映射以关联Files.Id&#39 ; s包含所有表的所有FileId,对吗?谢谢!
declare @match table
(OriginalId int, insertedId int);
merge into dbo.Documents as tgt
using dbo.Documents_staging as src
on 1 != 1
when not matched then
insert
(Number, Date)
values
(src.Number, Date)
output
src.Id,
inserted.Id
into
@match;
insert into Lines (Fkey, Number, Product)
select m.insertedId
,lines.Number
,lines.Product
from
Lines_Staging as lines
left join @match m
on lines.Fkey = m.OriginalId