TSQL 关系数据的大型插入,带外键更新

本文关键字:更新 插入 关系 数据 大型 TSQL | 更新日期: 2023-09-27 18:18:53

相对简单的问题。
Table AID int PK、独特Name varchar(500)cola, colb
Table B有一个外键来Table A

因此,在应用程序中,我们将表 A 和表 B 的记录生成到内存中的数据表中。

我们将在大量"客户"上生成数千条这样的记录。

最终,我们调用来存储这些记录。但是,表 A 中的记录可能已经存在于数据库中,因此我们需要获取已经存在的记录的主键,并插入缺失的记录。然后使用正确的外键插入表 B 的所有记录。

建议的解决方案:

我正在考虑将一个 xml 文档发送到 SQL Server,作为行集打开到 TableVarA 中,使用已存在的记录的主键更新TableVarA,然后插入缺少的记录并将其输出到 TableVarNew,然后我从TableVarA联合所有TableVarNew中选择Name和主键。

然后在代码中将正确的 FK 填充到内存中的TableB中,并使用 SqlBulkCopy 插入所有这些记录。

这听起来像是一个好的解决方案吗?如果是这样,在TableB内存中填充 FK 以匹配返回的 DataSet 中的主键的最佳方法是什么?

TSQL 关系数据的大型插入,带外键更新

听起来

像是一个计划 - 但我认为Table A的处理可以更简单(单个内存中表/表变量就足够了(:

  • 有一个包含所有行Table ATableVarA
  • 使用其 ID 更新所有现有行的ID(应该在单个 SQL 语句中可行(
  • 将所有不存在的行(仍有空ID(插入到Table A中,并记下其ID

这一切都可能发生在单个表变量中 - 我不明白为什么你需要复制东西......

处理完Table A后,正如您所说,更新Table B的外键并一次性批量插入这些行。

我不太清楚的是Table B引用是如何Table A的 - 你只是说它有一个 FK,但你没有指定它在哪一列上(假设在 ID 上(。那么,您的行如何从Table B引用新行的Table A,这些行尚未插入,因此尚未Table A ID

这更像是一个评论,而不是一个完整的答案,但我的空间已经用完了,所以请不要因为不符合答案标准而投票反对它。

我担心的是,评估一组缺少的键,然后批量插入,你会冒着密钥同时被添加到其他地方的风险。您说这可能来自大量客户,因此将会发生。 是的,你可以把它包装在一个大交易中,但大交易是猪会锁定其他客户。

我的想法是处理那些批量单独使用密钥的人,假设没有删除 PK 的风险。 TVP 是有效的,但您需要明确了解处理了哪些。 我认为您需要首先搜索名称以获取存在的PK列表,然后通过TVP进行处理。

为了数据完整性,通过根据需要创建 PK 的存储过程一次处理一个其余部分。

数以千计的记录并不可怕(数百万条是(。 大量的"客户"是可怕的部分。