2016-03-24 149 views
0

我对SSIS有点新。我使用的是SSIS 2012.输入文件是excel,csv和txt。在SSIS 2012中截断的日志列

数据必须从输入文件转储到数据库。输入文件中列的大小不断变化,所以我不能坚持固定长度。将包中连接管理器的数据类型更改为ntext可以解决此问题,但我们也有性能限制。因此,客户更喜欢截断额外的数据并且亲近他而不是影响性能。

行重定向将给予被截断的行。但是我想在每个文件中隐藏被截断的列中的客户。

SSISDB是否跟踪被截断的数据。如果是这样的话。

我打算将截断的数据写入单独的文件,然后使用脚本组件比较每列的长度。有没有更好的办法。

+0

我不明白你想做的行重定向不会给你什么。 “亲密顾客”意味着什么? –

+0

@TabAlleman跟踪每个文件中被截断的列并使用电子邮件任务发送这些列。 –

回答

1

将截断行(重定向)写入表中。您可以添加一个派生列来在重定向输入和写入表的输出之间添加源文件的名称(如果您获取该包以将其保存在变量中)。

如果您在每次运行之前截断表格,可以使用一个简单的ExecuteSQL将行数计入变量,然后通过电子邮件发送给客户(如果计数> 0),将会起作用。

+0

我想要在每个文件中截断的列。不是文件名本身 –

+0

错误输出自动包含名为ErrorCode和ErrorColumn的列。通过在高级编辑器中查找列ID,可以从ErrorColumn值中计算出列的名称。 – SebTHU

+0

我从来没有在SSIS中看到错误消息说哪列被截断。它总是说“数据会被截断”。 –

1

好的,据我所知,SSIS中没有任何东西可以自动跟踪哪些列被截断。

我可以想到一些方法来处理这个问题,它们都需要在脚本转换中发生主逻辑。

如果我必须这样做,我会创建一个脚本组件,用于“预测”哪些列在将它们传递到数据流的其余部分之前将被截断。

当您使用LEFT()将每个字符串截断为所需的长度时,您可以随后检查旧字符串和新字符串是否相同。

如果不是,那么您知道发生了截断,并且您可以填充要在发送电子邮件任务中使用的变量。

或者您可以先使用派生列截断列,然后使用脚本转换将旧列与新列进行比较。同样的逻辑。

+0

是的 - SSIS的输入错误处理都很好,但有限。如果数据非常不可靠,我发现在输入数据类型(将所有列设置为长DT_STR/ST_WSTR)时不太明确,并且在显式操作(SSIS,脚本化C#甚至SQL)中执行数据清理包裹。 – SebTHU

+0

@SebTHU我不追随你。这似乎是我建议使用SSIS Error Handers?那不是我的意图,我不确定我写的是什么,可以这样解释。 –

+0

没有。我同意你的建议,在包装流程中做这种事情会更好。 – SebTHU