在涉及Excel目标SSIS包,我已经使用Excel模板文件格式策略来克服您遇到的错误。
下面是一个示例,首先显示如何模拟您的错误消息,然后显示如何解决它。该示例使用SSIS 2008 R2和Excel 97-2003。
模拟
创建一个简单的表有两个字段Id
和Description
。用几条记录填充表格。
创建的SSIS包与单个数据流任务和数据流任务被配置为如下所示。它基本上由上述SQL Server表读取数据,然后试图说明列转换为Unicode文本设置为20
由于表字符长度具有有描述列值两行超过20个字符的长度,数据转换转换上的默认错误配置设置会使包失败。但是,我们需要重定向所有的错误行。因此,数据转换任务中的错误配置必须如下所示进行更改,以重定向错误行。
然后,我已经重定向错误输出到被配置为将输出到文件保存在路径C:\temp\Errors.xls
的Excel目标。首次执行包将会成功,因为Excel文件是空的。
该文件包含从表中的行,因为这两个国家都遇到的截断误差,因此重定向到错误输出。
删除Excel文件的内容,而不改变列标题后,如果我们再执行该程序包将失败。
原因失败的将是由于以下所示的错误消息。
这样就完成了在问题中提到的错误的模拟。这是解决问题的一种可能方式。
可能的解决方案
删除到错误输出重定向到现有的Excel文件目标。创建一个新的Excel连接管理器,路径为C:\temp\Template.xls
。放置新的Excel目标并将其指向新的Excel连接管理器,并使用Excel目标上的新建按钮在新的Excel文件中创建工作表。
创建名为TemplatePath
和ActualPath
的两个包变量。 TemplatePath的值应为C:\temp\Template.xls
,ActualPath的值应为C:\temp\Errors.xls
。实际路径是您希望创建文件的路径。在Excel连接管理器
右键单击和DelayValidation
属性设置为假和ServerName
表达设置为可变@ [用户:: ActualPath]。如果文件C:\temp\Errors.xls
不存在,DelayValidation将确保程序包在设计时不会抛出错误。设置ServerName表达式将确保程序包将使用变量ActualPath中提到的文件路径来生成文件。
在控制流选项卡,将一个文件系统任务的数据流任务的上方。
配置文件系统任务,如下所示。因此,文件系统任务将复制模板文件C:\temp\Template.xls
,并在每次运行程序包时创建一个新的目标文件C:\temp\Errors.xls
。如果文件C:\temp\Errors.xls
已经存在,则当文件系统任务中的OverwriteDestination
属性设置为True时,文件系统任务将简单地覆盖该文件。现在
,您可以继续运行包任意次数。该软件包不会失败,并且只有最后一次执行的错误消息,而无需手动清除Excel文件内容。
希望有所帮助。
[编辑]由史蒂夫B.直接加入到在后提供更多的细节,因为它的评论
在我的解决方案太长,我有我的SSIS项目拖Excel文件:Errors_Design_Template.xls
和Errors_Template.xls'. The former file contains my sheets with the headers and one line of data (using formulas like
=对于最大长度为1024的输入列,Rept(“A”,1024)“),后者在没有第一行数据的情况下完全相同。
这两个文件都在包的开始处从我的源目录复制到临时目录。我使用两个文件,因为我想保留设计时间验证,并且指向Excel连接中的模板文件的副本。我也复制模板文件,因为我经常执行我的包的单个数据流任务,并且我想填充临时文件,而不是我的项目中的模板文件(必须保持空白,但是标题和第一条虚拟数据线)。
我还使用了两个变量,一个用于Excel连接表达式,一个用于实际输出文件。我还必须编写一个脚本,其中包含我的两个变量作为输入。 ActualFilePath是可读写的。该脚本在运行时将ActualFilePath的值复制到ErrorFilePath变量。 (我现在还没有源代码,但如果可以帮助,我可以在下周粘贴它)。
一起使用这个组件允许我在设计时使Excel连接指向设计文件,并在运行时指向实际的错误文件,而不必将delayvalidation设置为true。
感谢这非常详细的答案。由于需要评论,所以我更详细地更新了答案。我使用了类似的解决方法来解决问题,但由于它非常难看,我并没有将其视为解决方案。仅供参考,我最终从一个Excel文件移动到Access文件(可以确保一个模式)的错误记录。使用Access的问题比Excel要少得多,我的客户用于构建Access数据库,所以对他来说这不是问题。 –
该公式位于模板文件中,而不是SSIS包的输出。这是一个比在单元格中写入1024个字符更长的字符串的简单方法。 Excel似乎在分析数据类型时会查看公式的结果。 –
这就是为什么SSIS真的需要改变。如果没有在这个地方留下额外的文件,你就不能使用excel,这太荒谬了。对于OP,如果您可以使用CSV代替,则不会有像这样的问题。 – Craig