TSQL 关系数据的大型插入,带外键更新
本文关键字:更新 插入 关系 数据 大型 TSQL | 更新日期: 2023-09-27 18:18:53
相对简单的问题。
Table A
有ID 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 中的主键的最佳方法是什么?
像是一个计划 - 但我认为Table A
的处理可以更简单(单个内存中表/表变量就足够了(:
- 有一个包含所有行
Table A
的TableVarA
- 使用其 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 的存储过程一次处理一个其余部分。
数以千计的记录并不可怕(数百万条是(。 大量的"客户"是可怕的部分。