相对简单的问题。
Table A
有ID int
PK,唯一的Name varchar(500)
,和cola, colb
等
表 B
有一个指向 表 A
的外键。
因此,在应用程序中,我们将表 A 和表 B 的记录生成到内存中的数据表中。
我们将在大量“客户端”上生成数千条这样的记录。
最终我们调用存储这些记录。但是,表A的记录可能已经存在于数据库中,所以我们需要获取已经存在的记录的主键,并插入缺失的记录。然后用正确的外键插入表 B 的所有记录。
建议的解决方案:
我正在考虑将 xml 文档发送到 SQL Server,以将其作为行集打开到 TableVarA
中,使用已存在记录的主键更新 TableVarA
,然后插入缺少的记录并将其输出到 TableVarNew
,然后我从 TableVarA
union all TableVarNew
中选择 Name
和主键.
然后在代码中将正确的 FK 填充到内存中的 TableB
中,并使用 SqlBulkCopy
插入所有这些记录。
这听起来是个不错的解决方案吗?如果是这样,在内存中为 TableB
填充 FK 以匹配返回数据集中的主键的最佳方法是什么。
最佳答案
听起来像是一个计划 - 但我认为 Table A
的处理可以更简单(单个内存表/表变量应该足够了):
- 有一个
TableVarA
,其中包含Table A
的所有行 - 使用 ID 更新所有现有行的
ID
(应该可以在单个 SQL 语句中完成) - 将所有不存在的行(仍然有一个空的
ID
)插入Table A
并记下它们的ID
<
这一切都可能发生在一个表变量中——我不明白为什么你需要到处复制东西......
如您所说,处理完Table A
后,更新Table B
的外键并一次性批量插入这些行。
我不太清楚的是 Table B
是如何引用 Table A
- 你只是说它有一个 FK,但你没有指定它是哪一列打开(假设打开 ID
)。那么 Table B
中的行如何引用 Table A
的新行,这些行尚未插入,因此没有 ID
在 表 A
中了吗?
关于c# - TSQL 大量插入关系数据,带外键 Upsert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8620794/