c# - TSQL 大量插入关系数据,带外键 Upsert

标签 c# sql-server-2005 tsql upsert

相对简单的问题。
Table AID 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/

相关文章:

sql - 选择具有命名空间的列作为 XML

mysql - SQL Select Data 具有多行条件

sql - SQL选择一行并存储在SQL变量中

sql-server-2005 - 如何以 SQL 2000 + SQL 2005 兼容的方式删除存储过程?

sql-server - 你如何对你的 T-SQL 进行单元测试

c# - NSwag:从一个 API 的多个版本生成 C# 客户端

sql - 表名作为变量

c# - 没有为控件模板中的数据网格设置依赖属性

c# - 按学校董事会和学校对教师名单进行分组

c# - WCF 与 ASP.NET Web API