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。
模拟
用两个字段Id
和Description
创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文件中的内容后,如果再次执行包,则会失败。
失败的原因是由于下面显示的错误信息。
这完成了对问题中提到的错误的模拟。 这是解决问题的一种可能的方法。
可能的scheme
删除错误输出redirect到的现有Excel文件目标。 使用pathC:\temp\Template.xls
创build一个新的Excel连接pipe理器。 放置新的Excel目标并将其指向新的Excel连接pipe理器,并使用Excel目标上的新buildbutton在新的Excel文件中创build工作表。
创build两个名为TemplatePath
和ActualPath
包variables。 TemplatePath应具有值C:\temp\Template.xls
,并且ActualPath应具有值C:\temp\Errors.xls
。 实际path是您希望创build文件的path。
右键单击Excel连接pipe理器并将DelayValidation
属性设置为False ,并将ServerName
expression式设置为variables@ [User :: ActualPath] 。 如果文件C:\temp\Errors.xls
不存在,DelayValidation将确保程序包在devise期间不会抛出错误。 设置ServerNameexpression式将确保包将使用variablesActualPath中提到的文件path来生成文件。
在“控制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.xls
和Errors_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表中。