批量插入自引用表
作者:互联网
这个问题是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