将ID列添加到(非规范化)原始文件源

时间:2014-01-13 13:51:54

标签: ssis

我有一个输出这种数据集的原始文件源:

╔════════╦════════╦═════════════╗
║ Region ║  City  ║ Subdivision ║
╠════════╬════════╬═════════════╣
║ R5     ║ City A ║ Q1          ║
║ R5     ║ City A ║ Q2          ║
║ R5     ║ City A ║ Q3          ║
║ R9     ║ City X ║ Q1          ║
║ R9     ║ City Y ║ Q1          ║
║ R9     ║ City B ║ Q1          ║
║ R9     ║ City B ║ Q2          ║
╚════════╩════════╩═════════════╝

我想在每个现有列中添加ID列,以获取此类数据集:

╔══════════╦════════╦════════╦════════╦═══════╦═════════════╗
║ RegionID ║ Region ║ CityID ║  City  ║ SubID ║ Subdivision ║
╠══════════╬════════╬════════╬════════╬═══════╬═════════════╣
║        1 ║ R5     ║      1 ║ City A ║     1 ║ Q1          ║
║        1 ║ R5     ║      1 ║ City A ║     2 ║ Q2          ║
║        1 ║ R5     ║      1 ║ City A ║     3 ║ Q3          ║
║        2 ║ R9     ║      2 ║ City X ║     4 ║ Q1          ║
║        2 ║ R9     ║      3 ║ City Y ║     5 ║ Q1          ║
║        2 ║ R9     ║      4 ║ City B ║     6 ║ Q1          ║
║        2 ║ R9     ║      4 ║ City B ║     7 ║ Q2          ║
╚══════════╩════════╩════════╩════════╩═══════╩═════════════╝

到目前为止,我找到了使用SQL Server数据库的方法,但我真的想避免这个中间步骤。 这可以在SSIS中完成吗?

修改

我必须清楚地了解如何使用数据库创建标识符(例如 IDENTITY 列)。

首先,这意味着我必须在我想要标识符时将数据持久化到数据库。我想在我必须写入数据库之前有标识符 - 在达到最后一步之前,不应将数据写入数据库。为什么?因为在最后一步中我将有相当多的(原始)文件源 - 其中很少是非常 BIG - 我将不得不相互验证一个并执行一些更正。如果它们在数据库中而不是原始文件,则必须更新一些文件。在SSIS中更新1M行是 REALLY SLOW 。想象一下,在一个包装中多次这样做。

即使我使用数据库表而不是原始文件源来获取中间结果,这也意味着我正在将临时数据写入数据库,以便我必须手动创建多个结构。在我的例子中,这总结了3个表,但这不是我唯一的数据源。想想~20个来源,类似于每个源2-5个表。这意味着创建40-100个临时表结构。我真的不想那样做。

1 个答案:

答案 0 :(得分:0)

生成递增序列号并将其注入SSIS中的数据流在技术上是可行的。这些文章向您展示了如何:

SSIS generating row numbers

How to Generate an Auto Incremental Number in a SSIS Package

但是,鉴于此要求,请不要这样做:

ID必须是在多个输出和多个cyles中持久存在的主键

为了您的方便和理智,我总是会在表格中跟踪这些ID:

CREATE TABLE dbo.Region( 
     RegionId int IDENTITY(1 , 1) NOT NULL
    ,Region varchar(10) NOT NULL
    ,ActiveIndicator int NOT NULL DEFAULT 1
    ,LoadDateTime datetime NOT NULL DEFAULT GETDATE( )
CONSTRAINT PK_Region PRIMARY KEY CLUSTERED( Region ASC ));

CREATE UNIQUE NONCLUSTERED INDEX [IX_Region_Candidate_Key] ON [dbo].[Region] 
([RegionId] ASC)
INCLUDE ( [Region],[ActiveIndicator]); 

SQL Server中的表为您提供了很多功能,而且不费吹灰之力:

  • 通过创建主键实现数据完整性
  • 利用IDENTITY属性创建唯一序列
  • 跟踪非活动区域(ActiveIndicator = 0)
  • 跟踪每个地区的加载日期和时间

我想你可以在数据库之外的平面文件中做同样的事情,但是在你的结尾会有更多的工作,并且更容易失去同步。

将其保存在数据库的表格中,您可以随时了解自己的真相来源。

您有什么令人信服的理由不将数据放入数据库?

如果一个是成本,那么它不一定是SQL Server。 SSIS可以连接到许多RDBMS(包括MySQL甚至MS Access)。