2011-11-23 27 views
0

我正在使用SSIS来执行数据迁移。SSIS excel目的地,如何强制LongText?

我正在使用Excel目标文件输出出错的所有内容。

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

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

CREATE TABLE语句正确定义LONGTEXT作为数据类型:

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

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

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

如何正确管理excel目标?

THX

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

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. 

回答

6

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

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

模拟

创建一个简单的表有两个字段IdDescription。用几条记录填充表格。

Records

创建的SSIS包与单个数据流任务和数据流任务被配置为如下所示。它基本上由上述SQL Server表读取数据,然后试图说明列转换为Unicode文本设置为20

Data Flow Task

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

Error Output

然后,我已经重定向错误输出到被配置为将输出到文件保存在路径C:\temp\Errors.xls的Excel目标。首次执行包将会成功,因为Excel文件是空的。

Success

该文件包含从表中的行,因为这两个国家都遇到的截断误差,因此重定向到错误输出。

Excel file

删除Excel文件的内容,而不改变列标题后,如果我们再执行该程序包将失败。

Failure

原因失败的将是由于以下所示的错误消息。

Error messages

这样就完成了在问题中提到的错误的模拟。这是解决问题的一种可能方式。

可能的解决方案

删除到错误输出重定向到现有的Excel文件目标。创建一个新的Excel连接管理器,路径为C:\temp\Template.xls。放置新的Excel目标并将其指向新的Excel连接管理器,并使用Excel目标上的新建按钮在新的Excel文件中创建工作表。

创建名为TemplatePathActualPath的两个包变量。 TemplatePath的值应为C:\temp\Template.xls,ActualPath的值应为C:\temp\Errors.xls。实际路径是您希望创建文件的路径。在Excel连接管理器

Variables

右键单击和DelayValidation属性设置为ServerName表达设置为可变@ [用户:: ActualPath]。如果文件C:\temp\Errors.xls不存在,DelayValidation将确保程序包在设计时不会抛出错误。设置ServerName表达式将确保程序包将使用变量ActualPath中提到的文件路径来生成文件。

Excel Connection properties

在控制流选项卡,将一个文件系统任务的数据流任务的上方。

Control Flow

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

File System Task

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

希望有所帮助。

[编辑]由史蒂夫B.直接加入到在后提供更多的细节,因为它的评论

在我的解决方案太长,我有我的SSIS项目拖Excel文件:Errors_Design_Template.xlsErrors_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。

+0

感谢这非常详细的答案。由于需要评论,所以我更详细地更新了答案。我使用了类似的解决方法来解决问题,但由于它非常难看,我并没有将其视为解决方案。仅供参考,我最终从一个Excel文件移动到Access文件(可以确保一个模式)的错误记录。使用Access的问题比Excel要少得多,我的客户用于构建Access数据库,所以对他来说这不是问题。 –

+0

该公式位于模板文件中,而不是SSIS包的输出。这是一个比在单元格中写入1024个字符更长的字符串的简单方法。 Excel似乎在分析数据类型时会查看公式的结果。 –

+0

这就是为什么SSIS真的需要改变。如果没有在这个地方留下额外的文件,你就不能使用excel,这太荒谬了。对于OP,如果您可以使用CSV代替,则不会有像这样的问题。 – Craig

0

它更好地使用控制流中的“执行任务”。在执行任务中指定与Excel连接管理器的连接。在SQL语句中,删除在Excel目标中创建图纸期间创建的Excel表。在drop之后创建相同的table.hence,下次数据将插入到excel表中。