我有一个SSIS包,即使输入错误也不会出错。在我的例子中,这个包从一个平面文件中读取并将记录放入SQL Server表中。很简单,没有什么花哨的东西在这里。
平面文件被定义为右边,每行80个字符,总共10列。问题:有时平面文件没有填充到80个字符,因此我们得到可变长度的行,而不是填充其余的空格。当发生这种情况时,我们希望失败。
在我的平面文件源组件中,我设置了错误输出部分,这样如果任何列被截断,组件将失败。但是,由于某些原因,当我从Visual Studio运行包时,所有步骤都是绿色的,即使没有导入任何行。这是我得到的输出:
SSIS包“SSIS包01.dtsx”开始。
信息:0x4004300A将数据导入Table01,DTS.Pipeline:验证阶段正在开始。
信息:0x4004300A将数据导入Table01,DTS.Pipeline:验证阶段正在开始。
信息:0x40043006在导入数据到Table01,DTS.Pipeline:准备执行阶段正在开始。
信息:0x40043007在导入数据到Table01,DTS.Pipeline:预执行阶段开始。
信息:0x402090DC将数据导入Table01,平面文件源[1]:文件“C:\ import_files \ sampledata.dat”的处理已经开始。
信息:0x4004300C将数据导入Table01,DTS.Pipeline:执行阶段开始。
警告:0x8020200F将数据导入Table01,平面文件源[1]:文件末尾有一个部分行。
信息:0x402090DE将数据导入Table01,平面文件源[1]:为文件“C:\ import_files \ sampledata.dat”处理的数据行总数为0。
信息:0x402090DF将数据导入Table01,OLE DB目标[5467]:数据插入的最终提交已经开始。
信息:0x402090E0在将数据导入Table01,OLE DB目标[5467]:数据插入的最终提交已结束。
信息:0x40043008在导入数据到Table01,DTS.Pipeline:后执行阶段开始。
信息:0x402090DD将数据导入Table01,平面文件源[1]:文件“C:\ import_files \ sampledata.dat”的处理已经结束。
信息:0x40043009在将数据导入Table01,DTS.Pipeline:清理阶段正在开始。
信息:0x4004300B在导入数据到Table01,DTS.Pipeline:“component”OLE DB Destination“(5467)”写了0行。
....所以没有导入记录,并且有关于部分行的警告,但包成功完成。当这个包被输入一个好的输入文件,每行80个字符时,它会导入尽可能多的行,而没有问题。
奇怪的是,当可变长度行用作输入时,我们有其他SSIS包失败。我已经看过并将这些包与此进行比较,因为我的生活看不出他们可能会做些什么不同。
如果您有任何想法或线索我可以效仿,我将不胜感激。谢谢!
答案 0 :(得分:2)
另一个解决方法是: 在SQL命令的开头插入SET NOCOUNT ON语句
我发现了这个: 的 http://louiebao.net/ssis-package-succeeded-without-errors-but-wrote-0-rows/ 强>
答案 1 :(得分:0)
好的,我们已经找到了这个。发生了什么是每行中的最后一列需要一个CR / LF ColumnDelimiter。
因此,当第一行被处理并且短缺时,SSIS不会仅仅因为它来得太快就不会确认CR / LF。它继续并继续处理第二行作为第一行的一部分。在这种情况下,第二行是剩下的所有,我们得到上面提到的截断消息,因为在字符80处永远不会遇到CR / LF。
如果另一个SSIS包失败,则许多行足够接近预期的行宽度,当包尝试将它们填充到单个字段时,会触发该字段的截断错误。