这个问题是一部分一个更复杂的问题 https://stackoverflow.com/questions/55047552/how-to-lock-and-unlock-a-sql-server-table?noredirect=1#comment96846989_55047552我正在分解成更小的块(为了我的理智)。
假设我有一个Parts
自引用的表看起来像这样:
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# 构建整个数据模型,包括所有PartId
's and ParentPartId
的。然后直接批量插入Parts
桌子。然而,这样做的问题是知道从什么 ID 开始。请记住,多个进程将同时运行,并且许多部分将是重复的。我们尝试使用 SEQUENCE 对象,但这带来了问题...... 100% 可能会处理重复的书籍,如果我们使用 SEQUENCE,这将导致 ID 中出现巨大的间隙。
我现在追求的课程是这样的......我们已经创建了一个Parts_Staging
表格看起来几乎与实际表格一样Parts
桌子。我们可以对其进行批量插入,没问题。然后使用一个简单的查询ProviderId
用于查找记录的列Parts_Staging
不存在于Parts
并将它们移过来。
但对于这条路径,我没有足够的创造力(或经验)来想象一种方法来进行此移动/合并并保持自引用 id 的完整性。
我一直在阅读类似“如何将数据插入到sql server中的自引用表中? https://stackoverflow.com/questions/14955439/how-to-insert-data-into-self-reference-table-in-sql-server" and "“但到目前为止我仍然没有看到异象。