【发布时间】:2021-06-14 11:31:01
【问题描述】:
在一个 SSIS 包中,我有一个平面文件,它可能有七列,或者最后有两列额外的列组成九列。
示例文件1:
StoreId,Overall Service Score,FindingHelp,Friendly,PaySpeed,GoodTarget,ExceptionalTarget
0286,0.84,0.79,0.90,0.84,0.81,0.81
0014,0.76,0.75,0.77,0.77,0.84,0.99
示例文件2:
StoreId,Overall Service Score,FindingHelp,Friendly,PaySpeed,GoodTarget,ExceptionalTarget,PPU_OverallScore,PPU_Target
0286,0.84,0.79,0.90,0.84,0.81,0.81,0.8,0.6
0014,0.76,0.75,0.77,0.77,0.84,0.99,0.9,1
这些文件的两个版本都可以在一个 SSIS 包中处理吗?如果可以,如何处理?
我已经像这样创建了一个数据流,这适用于例如 file2。但是,在尝试使用 file1 时,出现以下错误:
[Flat File Source [19]] Error: An error occurred while skipping data rows.
[SSIS.Pipeline] Error: SSIS Error Code DTS_E_PRIMEOUTPUTFAILED. The PrimeOutput method on Flat File Source returned error code 0xC0202091. The component returned a failure code when the pipeline engine called PrimeOutput(). The meaning of the failure code is defined by the component, but the error is fatal and the pipeline stopped executing. There may be error messages posted before this with more information about the failure.
我的条件流程:
更新:附上截图:
【问题讨论】:
-
他们可以是但不是由同一个数据流任务。 SSIS 需要定义良好的文件,而具有可变列数的文件没有定义良好。您需要确保有 2 个单独的源,可能还有 2 个单独的数据流任务,然后确保使用正确的一个。您还需要确保将数据源和数据流设置为延迟验证,以便在引用它们时验证它们,而不是在包开始执行时验证(这可能会由于文件之一而导致错误没有达到预期)。
-
或者,您可以让一个进程将“缺失”列添加到没有它们的文件中,或者从有它们的文件中删除它们,然后有一个进程来使用它们,但是这可能比仅仅实现条件流来为您正在使用的文件使用正确的数据流任务做更多的工作。理想情况下,您应该确保提供数据的任何进程都以一致的格式提供数据。
-
@larnu 示例 file2 是新的,因此能够处理两种不同格式的想法是,所以有一个备用选项是 file2 不起作用。我想另一种方法可能是创建一个单独的相同 SSIS 包来处理不同的文件格式?
-
如果您决定将 SSIS 用于变体 CSV 文件(其中每个文件可以是完整架构的不同子集的文件),您需要查看 Programmatic Packages。参考:Creating a Package Programmatically。这些可以从一个 SSIS 脚本任务中创建,该任务解析输入文件的标题行以创建一个动态包,将当前输入列映射到目标表中可用的列并在内存中执行它。它们并非微不足道。
-
请在您的问题中再添加一张屏幕截图。双击 Flat Fie Source 和 Conditional Split 之间的绿线。它将调出数据流路径编辑器。选择元数据,然后分享它的屏幕截图。
标签: sql-server ssis