SSIS excel目的地,如何强制长文本?

SSIS excel目的地,如何强制长文本?,excel,ssis,Excel,Ssis,我正在使用SSI执行数据迁移 我正在使用Excel目标文件输出出错的所有内容 在这个Excel文件中,我想输出两个错误列(错误号和错误列)以及输入组件中的所有列 除了字符串列超过255个字符外,这几乎可以正常工作。设置Excel目标时,我会创建一个新表 Create Table语句将Longtext正确定义为数据类型: CREATE TABLE `My data` ( `ErrorCode` Long, `ErrorColumn` Long, `ID` Long,

我正在使用SSI执行数据迁移

我正在使用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

[Edit]由于我不确定自己的解释,以下是我运行任务时的错误消息:

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 Destination的SSIS包中,我使用了Excel模板文件格式策略来克服您遇到的错误

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

模拟 创建了一个包含两个字段的简单表
Id
Description
。用两条记录填充表

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

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

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

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

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

失败的原因可能是由于下面显示的错误消息

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

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

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

右键单击Excel连接管理器,将
DelayValidation
属性设置为False,并将
ServerName
表达式设置为变量@[User::ActualPath]。如果文件
C:\temp\errors.xls
不存在,DelayValidation将确保包在设计期间不会抛出错误。设置ServerName表达式将确保包将使用变量ActualPath中提到的文件路径来生成文件

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

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

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

希望有帮助

[编辑]由Steve B.添加。直接在帖子中提供更多细节,因为评论太长

在我的解决方案中,我的SSIS项目中有两个Excel文件:
Errors\u Design\u Template.xls
Errors\u Template.xls”。前一个文件包含带有标题和一行数据的工作表(对于最大长度为1024的输入列,使用类似于
=Rept(“A”,1024)`的公式),后一个文件完全相同,没有第一行数据

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