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