【问题标题】:TSQL Large Insert of Relational Data, W/ Foreign Key UpsertSQL 关系数据的大插入,WITH/外键 Upsert
【发布时间】:2012-01-27 02:14:17
【问题描述】:

相对简单的问题。
Table AID int PK,唯一Name varchar(500),和cola, colb
Table B 有一个外键到Table A

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

我们将在大量“客户”上生成数千条此类记录。

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

建议的解决方案:

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

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

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

【问题讨论】:

    标签: c# sql-server-2005 tsql upsert


    【解决方案1】:

    听起来像是一个计划——但我认为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 的新行,这些行尚未插入,因此在Table A 中还没有ID

    【讨论】:

    • 这将在唯一名称上完成。您在谈论插入表 A 的哪些部分?我不是从两个带有联合的表变量中进行选择,而是使用 TableVarNew 的结果更新 TableVarA 并将其作为数据集返回?
    • 另外,我在stackoverflow.com/questions/3006472/… 上看到了您的回答,这听起来很聪明,但这似乎更多地与数据导入有关,而不是优化将要发生的很多事情。 IE:很多客户会在很多时候发送大量记录,因此确保我们快速插入所有这些记录非常重要。
    • @Thx:我不喜欢您打算使用至少两个(或三个?)不同的“TableA”变量并合并内容的事实。我认为您可以使用单个 TableA 变量完成所有必要的操作。另外:是的,也许使用SqlBulkCopy 将所有内容推送到服务器的临时表中然后进行所有修复的想法毕竟不是一个坏主意!
    【解决方案2】:

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

    我担心的是,评估一组丢失的密钥,然后批量插入,您会冒着同时将密钥添加到其他地方的风险。您说这可能来自大量客户,所以这将会发生。是的,您可以将其包装在大交易中,但大交易会导致其他客户端无法访问。

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

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

    数以千计的记录并不可怕(数百万是)。大量的“客户”是最可怕的部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      相关资源
      最近更新 更多