将带有数据流任务的记录传输到数据库表时保持正确的顺序

时间:2015-05-20 17:55:44

标签: sql-server ssis

我在SQL Server 2008的SSIS包中遇到以下问题。在容器中,我有大约50个数据流任务,它们都将数据从文本文件传输到SQL数据库中的一个表。每个文本文件都具有相同的结构,因此数据流相同。我已经为每次转移设置了一个接一个地发生。但是,在现在运行转移之后,顶线是从第39个表转移到第1774行!如何使目标表中的记录与传输的顺序完全相同?

1 个答案:

答案 0 :(得分:0)

对于不同数据流任务中的每个文件,您可以使用优先约束来按特定顺序进行每个文件处理,但这会对性能产生影响。

然而,就控制插入各行的顺序而言,我认为你运气不好。请记住,按设计,不保证表中行的顺序。 AFAIK,即使在具有聚簇索引的SQL Server中,他们也表示如果没有ORDER BY,查询结果集中的任何顺序都应该被认为是巧合。如果您需要特定订单,则应该在数据文件和表格中有一个字段,用于确定订单,例如日期,序列号或其他可排序字段。这样,您的查询就是数据驱动的,而不是实现驱动的。

另请参阅:Retain The Order while Insert Rows

正如所说,在大多数情况下,您可以使用IDENTITY列合理地接近,但如果您正在寻找保证,那么就没有了。在创建定义该关系的字段或表之前,行的顺序定义为不相关。这是RDBMS如何运作的一部分。

如果你绝对必须控制插入顺序(例如,因为应用程序需要它并且它不受你的控制),我认为你可能需要编写自己的程序或脚本来打开每个按顺序打开文件,打开与SERIALIZABLE事务隔离级别的连接,然后一次一个地插入自己的事务中的每一行,提交事务,然后移动到下一行。然而,这可能会慢得多,因为它有很多数据库开销。

即使这样,您只能控制插入行的顺序,而不是行实际存储在数据库中的顺序。您可以克服的最佳控制是群集密钥,正如我所说,这部分是实现驱动的巧合。