当行的管道数多于列数时,SSIS管道分隔文件不会失败?

Posted

技术标签:

【中文标题】当行的管道数多于列数时,SSIS管道分隔文件不会失败?【英文标题】:SSIS Pipe delimited file not failing when the row has more number pipes than the column number? 【发布时间】:2016-08-03 20:42:51 【问题描述】:

我的源文件是 (|) 管道分隔文本文件 (.txt)。我正在尝试使用 SSIS(SQL Server Data Tools 2012)将文件加载到 SQL Server 2012 中。我有三列。下面是文件中数据的外观示例。

我希望我的包应该失败,因为这是用管道(|)分隔的,而不是我的包是成功的,第三列的最后一行有多个管道进入最后一列。

我的问题是为什么包没有失败?我相信它有损坏的数据,因为如果我们使用分隔符它有更多的列? 如果我想使包失败,我有什么选择,如果分隔符的数量多于数字列?

【问题讨论】:

包按预期工作。它只是假设第一个管道之后的所有内容都是该列数据的一部分。您可以将数据用双引号括起来以防止这种情况发生。 数据源来自外部供应商。标准文件格式是 Pipe(|) Delimited。是否有解决方法使包失败? 【参考方案1】:

如果您查看平面文件连接管理器的高级页面,您可以知道发生了什么。对于除最后一个字段之外的所有字段,分隔符都是“|”,对于最后一个字段,它是 CRLF。

因此,按照设计,最后定义的管道和行尾 (CRLF) 之后的所有数据都将导入您的最后一个字段。

我要做的是向连接管理器和临时表添加另一列。在目标中映射新的“TestColumn”。导入完成后,您要确保此列在每一行中都为空。如果不是,则抛出错误。

您可以使用脚本任务,但这样您就不需要在 c# 中编写代码,也不必处理文件两次。如果您喜欢编写脚本任务和/或您不能使用带有额外列的临时表,那么这将是我能想到的唯一其他途径。

检查 null 的建议是使用执行 sql 任务,将单行结果设置为整数。如果值 > 0,则包失败。

查询将是 Select Count(*) NotNullCount From Table Where TestColumn 不为 Null。

【讨论】:

【参考方案2】:

您可以编写一个脚本任务来读取文件,计算管道数,如果管道数不是您想要的,则会引发错误。

【讨论】:

您有任何示例脚本吗?这会很有帮助。 不,抱歉,我手边没有任何管道计数脚本。

以上是关于当行的管道数多于列数时,SSIS管道分隔文件不会失败?的主要内容,如果未能解决你的问题,请参考以下文章

SSIS 包顽固的平面文件连接管理器

平面文件到 SSIS 中的 Netezza 加载

当列数少于列数时,Chrome 列错误

Jmeter仪表板因管道分隔符jtl失败

WSO2 EI:在csv文件中添加管道分隔符

操作系统之进程通信——管道