批量插入具有未知自动递增ID的相关数据集

时间:2014-06-27 19:18:49

标签: c# sql-server tsql

我们正在将数据库主键从GUID转换为自动递增的INT。我们从文本文件中解析数据并将其放入两个C#DataTables ClaimClaimCharge,我们一直用它们批量插入到数据库中具有相同名称的表中。在数据库中,ClaimCharge.ClaimIDClaim.ID的外键,并且一项索赔存在多项索赔。

使用GUID,我们在C#中生成了ClaimClaimCharge ID,因此批量插入没有问题。但是对于INT,我不知道Claim.ID会是什么,所以我不能指定ClaimCharge.ClaimID。我需要一些关于如何通过INT实现这一点的想法。

例如,如果Claim表可以手动锁定插入,我可以:

  1. 批量插入名为ClaimBulkData ClaimChargeBulkData的备用表。为方便起见,这些表仍将使用GUID来保持C#和SQL之间的关系。
  2. 手动锁定Claim表格以防止插入(不知道是否可行)并获取最大值(ID)。
  3. 使用MAX(ID)增加ClaimBulkData中的所有数据。
  4. 使用新更新的INT
  5. ClaimChargeBulkDataClaimBulkData相关联
  6. 使用Claim将数据作为集合插入到真实IDENTITY_INSERT ON表中,使用某种异常来处理步骤2中创建的虚拟锁。
  7. 手动创建锁定Claim表格上的插页(我再也不知道这是否可行。
  8. 将数据插入真实的ClaimCharge表。
  9. 我想避免在C#或T-SQL中一次插入一行数据。

1 个答案:

答案 0 :(得分:1)

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

即,

假设您有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列本身。

如果您的目的是通过此重组减少整体磁盘使用量,那么一旦清理完所有内容,您就可以运行数据库包。重点是在这样的过程中修改外键的工作。