合并使用标识密钥的父和子SQL Server表

时间:2017-12-18 11:40:38

标签: c# sql sql-server

我需要将几个大的CSV文件导入SQL Server 2016 Express。

这些文件通过身份密钥相关联,因为Documents.csv中的每个项目都由Pkey与Fkey中Lines.csv中的项目相关联。不允许使用自然键(用于intance文档编号),因为可能存在重复项。

我已使用C#中的SqlBulkCopy将这些文件导入SQL Server登台表。屏幕截图显示了这些临时表之间的关系:

Table relations image

现在我需要将这些表复制到最后的表中,在这个过程中我需要创建代理键并保留以前的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 

0 个答案:

没有答案