其他分享
首页 > 其他分享> > 批量插入自引用表

批量插入自引用表

作者:互联网

这个问题是a much more complex problem的一部分,我正在细分成小块(出于理智).

假设我有一个自我参考的部件表,看起来像这样:

PartId  ParentPartId  Description             PartNumber   IsCatHeader     ProviderId
---------------------------------------------------------------------------------------
9292       null       'Engine Parts'           null           1      'Engine Parts||1'
9293       9292       'Engine Bolts'           null           1      'Engine Bolts||1'
9294       9293       '6mm Engine Bolt'        'X1-234-ABC'     0      '6mm Engine Bolt|X1-234-ABC|0'
9295       9293       '5mm Engine Bolt'        'X2-934-BCD'     0      '5mm Engine Bolt|X2-934-BCD|0'
9296       9295       '5mm Engine Bolt Washer' 'X2-934-GED'     0      '5mm Engine Bolt Washer|X2-934-GED|0'

你明白了.现在,我们正在导入这些部分的整本书(大量CSV文件),从而在一本书中导入了数百个订单项.

部分内容经常在书籍之间重复,而我们的工作之一就是将重复内容保留在数据库之外.

源没有为这些部分提供任何种类的唯一ID,因此我们创建了ProviderId列,该列是每个创建唯一字符串的记录中数据部分的集合.然后,我们可以在导入时使用它来检查重复项. (此列中的实际数据比我在这里显示的要复杂.)

所以,现在到我的问题.我正在尝试找出批量执行此操作的最佳方法.一种选择(不好的选择)是从C#应用程序一次循环浏览每个项目….插入父项,获取范围标识,插入所有子项,等等.在大书中,这将导致每本书成千上万的数据库调用.别无选择.

我们需要批量插入解决方案.但是我们对此的自引用方面确实有一个难题.

我们最初的想法是在C#中构建ENTIRE数据模型,包括所有PartId和ParentPartId.然后将其直接直接插入“零件表”中.但是,与此有关的问题是知道以什么ID开头.请记住,多个进程将同时运行,并且许多部分将重复.我们尝试使用SEQUENCE对象,但这带来了问题…如果处理重复的书,则有100%的可能性,如果使用SEQUENCE,这将导致ID的巨大缺口.

我现在要追求的课程是…我们创建了一个Parts_Staging表,该表看起来几乎与实际的Parts表类似.我们可以对其进行批量插入,没问题.然后,使用ProviderId列在Parts_Staging中查找在Part中不存在的记录并将其移到上面,这是一个简单的查询.

但是,通过这种方式,我没有足够的创造力(或经验丰富)来想象实现此移动/合并并保持自引用ID完好无损的方法.

我一直在阅读“ How to Insert data into self reference table in sql server?”和“ T-SQL – Insert Data into Parent and Child Tables”之类的主题,但到目前为止,我仍然没有看到这个愿景.

解决方法:

好.这就是我要做的.首先,用C#组成集合中的序列及其父子关系.但是我会把它放在不同的列中,也许像BatchPartId和BatchParentPartId之类. (也许是一个不同的关联表.没关系.)

| PartId | ParentPartId | BatchPartId | BatchParentPartId |
|--------|--------------|-------------|-------------------|
|        |              | XX1901      |                   |
|        |              | XX1902      | XX1901            |
|        |              | XX1903      | XX1901            |
|        |              | XX1904      | XX1903            |
|        |              | XX1905      | XX1903            |

然后,插入整个列表,以允许创建PartId.

| PartId | ParentPartId | BatchPartId | BatchParentPartId |
|--------|--------------|-------------|-------------------|
| 55     |              | XX1901      |                   |
| 56     |              | XX1902      | XX1901            |
| 57     |              | XX1903      | XX1901            |
| 58     |              | XX1904      | XX1903            |
| 59     |              | XX1905      | XX1903            |

发布后,您可以在此处用子行的BatchParentPartId中的相应BatchPartId填充该行的PartId和ParentPartId.

| PartId | ParentPartId | BatchPartId | BatchParentPartId |
|--------|--------------|-------------|-------------------|
| 55     |              | XX1901      |                   |
| 56     | 55           | XX1902      | XX1901            |
| 57     | 55           | XX1903      | XX1901            |
| 58     | 57           | XX1904      | XX1903            |
| 59     | 57           | XX1905      | XX1903            |

标签:sql-server-2017,c,net,sql-server
来源: https://codeday.me/bug/20191108/2006274.html