SSIS excel目的地,如何强制LongText?

我正在使用SSIS来执行数据迁移。

我正在使用Excel目标文件输出错误的一切。

在这个Excel文件中,我想要输出两个错误列(错误编号和错误列)以及input组件中的所有列。

除了当我有超过255个字符的string列时,这几乎工作。 当我设置我的Excel目标时,我创build一个新的表。

Create Table语句将Longtext正确地定义为数据types:

CREATE TABLE `My data` ( `ErrorCode` Long, `ErrorColumn` Long, `ID` Long, `MyStringColumn` LongText ) 

这是第一次。 然后,我从Excel文件中删除所有数据,因为我想在输出错误之前清理excel文件。

当我在包devise器中返回时,我的列定义被搞乱了。 每个文本列都作为nvarchar(255)处理,不再有ntext。 当我的数据超过255时,这打破了我的组件。

我怎样才能妥善pipe理Excel的目的地?

谢谢

[编辑]由于我不知道我的解释,这里是我运行任务时的错误消息:

 Error: 0xC0202009 at MyDataTask, To Errors file [294]: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80040E21. Error: 0xC0202025 at MyDataTask, To Errors file [294]: Cannot create an OLE DB accessor. Verify that the column metadata is valid. Error: 0xC004701A at MyDataTask, SSIS.Pipeline: component "To Errors file" (294) failed the pre-execute phase and returned error code 0xC0202025. 

在涉及Excel目标的SSIS包中,我使用了Excel模板文件格式策略来克服您遇到的错误。

下面是一个示例,首先显示如何模拟您的错误消息,然后显示如何解决它。 该示例使用SSIS 2008 R2与Excel 97-2003。

模拟

用两个字段IdDescription创build一个简单的表。 用两个logging填充表格。

记录

创build一个SSIS包与单个数据stream任务和数据stream任务configuration如下所示。 它基本上读取上述SQL Server表中的数据,然后尝试将Description列转换为字符长度设置为20的Unicode文本。

数据流任务

由于该表有两行的“描述”列值超过20个字符,因此数据转换转换中的默认错误configuration设置会使包失败。 但是,我们需要redirect所有的错误行。 因此,数据转换任务上的错误configuration必须如下所示进行更改,以redirect错误行。

错误输出

然后,我将错误输出redirect到Excel目标,该目标被configuration为将输出保存到pathC:\temp\Errors.xls 。 首先执行包将会成功,因为Excel文件是空的。

成功

该文件将包含来自表的两个行,因为两者都会遇到截断错误,因此被redirect到错误输出。

Excel文件

在不更改列标题的情况下删除Excel文件中的内容后,如果再次执行包,则会失败。

失败

失败的原因是由于下面显示的错误信息。

错误消息

这完成了对问题中提到的错误的模拟。 这是解决问题的一种可能的方法。

可能的scheme

删除错误输出redirect到的现有Excel文件目标。 使用pathC:\temp\Template.xls创build一个新的Excel连接pipe理器。 放置新的Excel目标并将其指向新的Excel连接pipe理器,并使用Excel目标上的新buildbutton在新的Excel文件中创build工作表。

创build两个名为TemplatePathActualPath包variables。 TemplatePath应具有值C:\temp\Template.xls ,并且ActualPath应具有值C:\temp\Errors.xls 。 实际path是您希望创build文件的path。

变量

右键单击Excel连接pipe理器并将DelayValidation属性设置为False ,并将ServerNameexpression式设置为variables@ [User :: ActualPath] 。 如果文件C:\temp\Errors.xls不存在,DelayValidation将确保程序包在devise期间不会抛出错误。 设置ServerNameexpression式将确保包将使用variablesActualPath中提到的文件path来生成文件。

Excel连接属性

在“控制stream”选项卡上,将“文件系统任务”放置在“数据stream”任务上方。

控制流

configuration文件系统任务,如下所示。 因此,文件系统任务将复制模板文件C:\temp\Template.xls并在每次运行程序包时创build一个新的目标文件C:\temp\Errors.xls 。 如果文件C:\temp\Errors.xls已经存在,则当文件系统任务中的OverwriteDestination属性设置为True时,文件系统任务将简单地覆盖该文件。

文件系统任务

现在,您可以继续运行该包任意次数。 该软件包不会失败,并且您将只有来自上次执行的错误消息,而无需手动清除Excel文件内容。

希望有所帮助。

[编辑]添加由史蒂夫乙提供更多的细节直接在post中,因为它太长的评论

在我的解决scheme中,我在我的SSIS项目中Errors_Design_Template.xls Excel文件: Errors_Design_Template.xlsErrors_Template.xls'. The former file contains my sheets with the headers and one line of data (using formulas like Errors_Template.xls'. The former file contains my sheets with the headers and one line of data (using formulas like (对于最大长度为1024的input列, Errors_Template.xls'. The former file contains my sheets with the headers and one line of data (using formulas like = Rept(“A”,1024)“ Errors_Template.xls'. The former file contains my sheets with the headers and one line of data (using formulas like ),后者与第一行数据完全相同。

这两个文件都在包的开始处从我的源目录复制到临时目录。 我使用两个文件,因为我想保持devise时间validation,并且指向Excel连接中的模板文件的副本。 我也复制模板文件,因为我经常执行我的包的单个数据stream任务,我想填充一个临时文件,而不是我的项目中的模板文件(它必须保持空,但标题和第一个虚拟数据线)。

我还使用了两个variables,一个用于Excel连接expression式,一个用于实际的输出文件。 我也不得不写一个脚本有我的两个variables作为input。 ActualFilePath是可读写的。 该脚本在运行时将ActualFilePath的值复制到ErrorFilePathvariables。 (我现在还没有源代码,但是如果可以的话,我可以在下周粘贴它)。

同时使用这个组件可以让我在devise时使Excel连接指向devise文件,并在运行时指向实际的错误文件,而不必将delayvalidation设置为true。

最好在控制stream中使用“执行任务”。在执行任务中指定与excel连接pipe理器的连接。在SQL语句中,删除在excel目标中创build表单时创build的excel表。 之后下降创build相同的table.hence下一次数据将插入到Excel表中。