我有一个输出这种数据集的原始文件源:
╔════════╦════════╦═════════════╗
║ 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个临时表结构。我真的不想那样做。
答案 0 :(得分:0)
生成递增序列号并将其注入SSIS中的数据流在技术上是可行的。这些文章向您展示了如何:
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
属性创建唯一序列我想你可以在数据库之外的平面文件中做同样的事情,但是在你的结尾会有更多的工作,并且更容易失去同步。
将其保存在数据库的表格中,您可以随时了解自己的真相来源。
您有什么令人信服的理由不将数据放入数据库?
如果一个是成本,那么它不一定是SQL Server。 SSIS可以连接到许多RDBMS(包括MySQL甚至MS Access)。