【发布时间】:2018-10-17 22:48:05
【问题描述】:
我有一个平面文件中的记录,其中包含您可能认为是主记录的内容,其中详细记录在它们相关的主记录之后,直到主记录。
这是一个例子:
Order123, Customer1, 1/1/2018
Item1, $1
Item2, $1
Order124, Customer2, 1/1/2018
Item1, $1
Item4, $2
该文件没有内置的行号或任何类型的排序,也没有使用外键将主与细节相关联。
如果我要使用 SSIS 将原始 TXT 数据导入一个灵活的表中,该表的列旨在采用各种数据类型(即 nvarchar(255) 或类似的),我可以在导入后迭代这些值,并将第 2 行和第 3 行中带有 Order123 的值;因此,第 5 行和第 6 行是 Order124。
保存原始数据的表将使用一个简单的 RecordID 标识列,其中整数递增一。
这并不重要,但如果你好奇的话,我所指的实际数据是 Retrosheet 数据事件文件。它是所有美国职业棒球大联盟数据的集合。可以从此页面上的链接下载真实文件: https://www.retrosheet.org/game.htm
我似乎记得您无法将 TXT 数据导入表并期望行的顺序与 TXT 行的顺序相匹配。但是,当我对此进行小型测试时,记录确实以与源文件相同的顺序出现。我怀疑我的小测试结果好得令人难以置信,也不能预测结果如何。
总结:
如何使用 SSIS 导入数据,按照与原始平面文件相同的顺序插入 SQL 记录?
【问题讨论】:
-
回想一下,是否是 DTS(SSIS 之前的数据转换服务)中的“多阶段数据泵”使原始数据无序?也许这就是我质疑这个的原因?
-
我试图确认这一点,但我认为它们确实是按顺序出现的。即使如此,如果没有对数据进行排序的方法,您将无法按顺序查询/处理它们。您需要在表格上有类似 IDENTITY 列的内容。
-
源将以其自然顺序被消耗。但在那之后,不能保证它会保持这种状态。当数据进入时,您可能需要分配一个行号,如果您必须再次对其进行排序,则随后使用该行号。您可以通过脚本组件(转换)任务直接提供源,该任务每次处理一行时都会计数,并将该计数器分配给新的输出列。
-
实际上没有 GTD... 学到了这个艰难的方式。我最终加载为 single_blob,然后用序列号解析
-
脚本组件添加行号是要走的路。只有几行 C# 或 vb
标签: sql-server ssis data-warehouse