首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSIS擅长目的地,如何强制LongText?

SSIS擅长目的地,如何强制LongText?
EN

Stack Overflow用户
提问于 2011-11-23 09:24:34
回答 2查看 18.8K关注 0票数 0

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

我使用Excel目标文件输出所有出错的东西。

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

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

Create语句正确地将Longtext定义为数据类型:

代码语言:javascript
复制
CREATE TABLE `My data` (
    `ErrorCode` Long,
    `ErrorColumn` Long,
    `ID` Long,
    `MyStringColumn` LongText
)

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

当我返回包设计器时,我的列定义会混乱。每个文本列都作为nvarchar(255)处理,而不再使用ntext。这会破坏我的组件,因为我的数据超过255。

如何正确管理excel目的地?

thx

编辑(我不确定我的解释),下面是运行任务时的错误消息:

代码语言:javascript
复制
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.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-23 20:56:43

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

下面是一个示例,首先演示如何模拟错误消息,然后说明如何修复错误消息。该示例在Excel97-2003中使用SSIS 2008 R2。

模拟

创建了一个包含两个字段IdDescription的简单表。用几个记录填充了这个表。

创建了一个具有单个数据流任务的SSIS包,并配置了数据流任务,如下所示。它基本上从上面提到的Server表中读取数据,然后尝试将描述列转换为字符长度设置为20的Unicode文本。

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

然后,我将错误输出重定向到一个Excel目标,该目标被配置为将输出保存到路径C:\temp\Errors.xls中的文件。包的第一次执行将是成功的,因为Excel文件一开始是空的。

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

删除Excel文件中的内容而不更改列标题后,如果我们再次执行包,它将失败。

导致故障的原因将是由于下面显示的错误消息。

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

可能解决办法

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

创建两个名为TemplatePathActualPath的包变量。TemplatePath应该有值C:\temp\Template.xls,而ActualPath应该有值C:\temp\Errors.xls。实际路径是希望创建文件的路径。

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

在“控制流”选项卡上,将“文件系统任务”置于数据流任务之上。

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

现在,您可以继续运行包的任何次数。包不会失败,而且您将只有上次执行时的错误消息,而不必手动清除Excel文件内容。

希望这能有所帮助。

编辑由Steve .添加,直接在文章中提供更多的细节,因为太长了,不能发表评论

在我的解决方案中,我的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 =Rept(“A”,1024 ),对于长度为1024的输入列,后者与第一行数据完全相同。

这两个文件都会在包的开头从我的源目录复制到临时目录。我使用两个文件是因为我希望保持设计时验证,并且我指向Excel连接中模板文件的副本。我复制模板文件也是因为我经常执行包的单个数据流任务,并且我希望填充一个临时文件,而不是我的项目中的模板文件(它必须保持为空,而是头和第一行虚拟数据)。

我还使用了两个变量,一个用于Excel连接表达式,一个用于实际输出文件。我还必须编写一个脚本,将我的两个变量作为输入。ActualFilePath是读/写。脚本在运行时将ActualFilePath的值复制到ErrorFilePath变量.(到目前为止,我还没有源代码,但如果可以的话,我可以在下周粘贴它)。

同时使用此组件可以让Excel连接在设计时指向设计文件,并在运行时指向实际的错误文件,而不必将延迟验证设置为true。

票数 6
EN

Stack Overflow用户

发布于 2014-09-29 08:23:11

最好在控制flow.In执行任务中使用“执行任务”,指定到excel连接的连接,manager.In语句删除excel表,该表是在excel目标中创建的。删除后,下次在excel表中插入数据时,创建相同的table.hence。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8239754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档