C# 大容量插入具有未知自动递增ID的相关数据集

C# 大容量插入具有未知自动递增ID的相关数据集,c#,sql-server,tsql,C#,Sql Server,Tsql,我们正在将数据库主键从guid转换为自动递增的int。我们从文本文件中解析数据,并将其放入两个C#DataTablesClaim和ClaimCharge中,我们一直使用它们将数据批量插入数据库中同名的表中。在数据库中,ClaimCharge.ClaimID是Claim.ID的外键,一个索赔存在多个索赔费用 使用GUIDs,我们在C#中生成了索赔和索赔ID,因此批量插入没有问题。但是对于INTs,我不知道Claim.ID将是什么,所以我无法分配ClaimCharge.ClaimID。我需要一些关于

我们正在将数据库主键从guid转换为自动递增的int。我们从文本文件中解析数据,并将其放入两个C#DataTables
Claim
ClaimCharge
中,我们一直使用它们将数据批量插入数据库中同名的表中。在数据库中,
ClaimCharge.ClaimID
Claim.ID
的外键,一个索赔存在多个索赔费用

使用GUIDs,我们在C#中生成了
索赔
索赔
ID,因此批量插入没有问题。但是对于INTs,我不知道Claim.ID将是什么,所以我无法分配
ClaimCharge.ClaimID
。我需要一些关于如何用INTs实现这一点的想法

例如,如果可以针对insert手动锁定
索赔
表,我可以:

  • 批量插入名为
    ClaimBulkData
    ClaimChargeBulkData
    的备用表中。这些表仍然使用guid,以方便保持C#和SQL之间的关系
  • 手动锁定
    索赔
    表以防止插入(不知道是否可能),并获取最大值(ID)
  • 使用MAX(ID)递增
    ClaimBulkData
    中的所有数据
  • 使用最新更新的INT将
    ClaimChargeBulkData
    关联到
    ClaimBulkData
  • 使用
    IDENTITY\u Insert ON
    将数据作为一个集合插入real
    Claim
    表中,使用步骤2中创建的假想锁的某种异常
  • 针对
    索赔
    表上的插入释放手动创建的锁(同样,我不知道这是否可行)
  • 将数据插入real
    ClaimCharge
    表格

  • 我希望避免在C#或T-SQL中一次插入一行数据。

    为什么不将新的自动增量列添加到主表中?这样您就可以同时拥有GUID和autoid列,以便修复外键关系(一次一个主表)

    i、 e

    假设您有master1和detail1和detail1

    alter table Master1 add ID int identity(1,1) not null
    GO
    
    alter Detail1 add master1ID int null
    GO
    alter Detail2 add master1ID int null
    GO
    
    然后在oldguid键上加入Master1的基础上更新Detail1和Detail12,为每个表设置Master1ID的相应值

    然后,可以将基于Master1ID的外键添加到Detail和Detail2中

    此时,您应该拥有基于这两组键的完整数据集,并且您可以测试更新视图等,以确保它们与新的整数ID一起工作

    最后,一旦一切就绪,就转到不需要的GUID外键和GUID列本身


    如果您的目的是通过这种重组来降低总体磁盘使用率,那么在清理并转换完所有内容后,您始终可以运行数据库包。重点是,在这样的过程中,大部分工作是修复外键。

    使用此版本:Microsoft SQL Server 2008(SP3)-10.0.5512.0(X64)。2012年8月22日19:25:47。版权(c)1988-2008 Windows NT 6.0上的Microsoft Corporation标准版(64位)(Build 6002:Service Pack 2)感觉上,您是在与SQL Server对抗,而不是让它为您服务。为什么不直接插入记录,而不是在获得X个记录后进行批量插入?感觉上,您将遇到重大的引用完整性问题。下面是另一个想法。当您解析文本文件时,您如何区分哪些索赔费用将连接到索赔?(在C#中生成任何连接之前)。非常酷,好主意!你让我大吃一惊!喜欢它的简单性。更多背景信息:插入到master/detail是一个日常业务流程,因此我无法删除列。空间是一个问题,但转换的主要问题是查找/插入性能。因此,现在的计划是保留旧的guid列然后将它们重命名为BulkUpdateReferenceId,这样它们的作用就显而易见了。在每次插入/键修复之后,我想我可以将其设置为null以节省空间?但这样一来,任何guid列上都不会有索引,也不会使用它们进行查找,除了您描述的初始FK修复。