为了处理在转换过程中可能发生的错误,MicrosoftIntegration Services 允许根据每个组件和每个列来决定如何处理无法转换的数据。 可以选择忽略某些列中的失败、重定向整个失败的行或者只是使组件失败。 默认情况下,Integration Services 中的所有组件被配置为在发生错误时失败。 而使组件失败又会导致包失败,并使所有后续处理停止。

如果不让失败导致包停止执行,一个好方法是通过配置使在转换中发生潜在处理错误时这些错误能够得到处理。 虽然可能选择忽略失败以确保包成功运行,但通常更好的做法是将失败的行重定向到另一个处理路径,在这里可以使数据和错误持久化、接受检查并在随后的某个时间对其进行重新处理。

在本课中,将创建在Lesson 3: Adding Logging中开发的包的副本。 使用这个新包时,将创建一个示例数据文件的损坏版本。 损坏的文件将在运行包时强制发生处理错误。

为了处理错误数据,您将添加并配置一个平面文件目标,它会将所有无法在 Lookup Currency Key 转换中找到查找值的行写入文件。

将错误数据写入文件之前,需要包括一个使用脚本获取错误说明的脚本组件。 然后,将重新配置 Lookup Currency Key 转换,以便将所有无法处理的数据重定向到脚本转换中。

Step 1 : 复制第 3 课包

Step 2: 创建损坏的文件

  1. 在记事本或任何其他文本编辑器中,打开 Currency_VEB.txt 文件。示例数据与 SSIS 课程包一起提供。 若要下载示例数据和课程包,请执行以下操作。使用文本编辑器的查找和替换功能,查找 VEB 的所有实例,并将其替换为 BAD。使用文本编辑器的查找和替换功能,查找 VEB 的所有实例,并将其替换为 BAD。在包含其他示例数据文件的同一文件夹中,将修改后的文件另存为 Currency_BAD.txt。
    1. 导航到 Integration Services 产品示例
    2. 单击“下载”选项卡。
    3. 单击 SQL2012.Integration_Services.Create_Simple_ETL_Tutorial.Sample.zip 文件。
  2. 关闭文本编辑器。

验证是否将在运行时发生错误

  1. 在“调试”菜单中,单击“启动调试”。

    在数据流第三次迭代时,Lookup Currency Key 转换将尝试处理 Currency_BAD.txt 文件,并且该转换将失败。 转换失败将导致整个包失败。

  2. 在“调试”菜单中,单击“停止调试”。

  3. 在设计图面上,单击“执行结果”选项卡。

  4. 浏览日志,确认是否发生了以下未处理的错误:

    [Lookup Currency Key[27]] Error: Row yielded no match during lookup.

  

Step 3: 添加错误流重定向

如上一个任务中所示,当 Lookup Currency Key 转换尝试对产生错误的已损坏示例平面文件进行处理时,该转换无法生成匹配。由于转换针对错误输出使用了默认设置,因此,任何错误都将导致该转换失败。当转换失败时,该包的其余部分也将失败。

可以使用错误输出将组件配置为将失败的行重定向到其他处理路径,而不是允许转换失败。使用单独的错误处理路径,您可以执行多项任务。例如,您可能要尝试清除该数据,然后重新处理失败的行。或者,您可能要将失败的行与其他错误信息保存在一起,以便以后进行验证和重新处理。

在本任务中,您将 Lookup Currency Key 转换配置为将所有失败的行重定向到错误输出。在数据流的错误分支中,这些行将被写入文件中。

默认情况下,Integration Services 错误输出中的另外两列(ErrorCode 和 ErrorColumn)只包含表示错误号的数值代码以及出现错误的列的 ID。如果没有相应的错误说明,这些数值没有多大用处。

若要更有效地使用错误输出,请在包将失败的行写入文件之前,使用脚本组件来访问 Integration Services API,然后获取错误说明。

配置错误输出

  1. 在“SSIS 工具箱”中,展开“公共”,然后将“脚本组件”拖动到“数据流”选项卡的设计图面上。将“脚本”放置在 Lookup Currency Key 转换的右侧。

  

  2. 在“选择脚本组件类型”对话框中,单击“转换”,再单击“确定”。

  3. 单击“Lookup Currency Key”转换,然后将红色箭头拖动到新添加的“脚本”转换上,以连接这两个组件。

  4. 红色箭头表示“Lookup Currency Key”转换出现错误输出。通过使用红色箭头将转换连接到脚本组件,您可以将所有处理错误重定向到脚本组件,然后,该组件会处理这些错误并将它们发送到目标。

  5. 在“配置错误输出”对话框的“错误”列中,选择“重定向行”,再单击“确定”。

  6. 在“数据流”设计图面上,在新添加的“脚本组件”中单击“脚本组件”,然后将该名称更改为获取错误说明。

  

  7. 双击 Get Error Description 转换。

  8. 在“脚本转换编辑器”对话框中的“输入列”页中,选择 ErrorCode 列。

  9. 在“输入和输出”页中,展开“输出 0”,单击“输出列”,再单击“添加列”。

  10. 在 Name 属性中,键入错误说明并将 DataType 属性设置为“Unicode string [DT_WSTR]”。

  

  11. 在“脚本”页中,确保已将 LocaleID 属性设置为“英语(美国)”。

  12. 单击“编辑脚本”打开 MicrosoftVisual Studio Tools for Applications (VSTA)。在 Input0_ProcessInputRow 方法中,键入或粘贴以下代码。

  

Step 4: 添加平面文件目标

Lookup Currency Key 转换的错误输出将无法执行查找操作的所有数据行重定向到脚本转换。为了突显相关错误的信息,脚本转换将运行可获取错误说明的脚本。在本任务中,请将有关失败行的所有这些信息保存到分隔的文件中,以便进行后续处理。若要保存失败的行,必须为将包含错误数据和平面文件目标的文本文件添加并配置平面文件连接管理器。通过设置平面文件目标所用平面文件连接管理器的属性,可以指定平面文件目标如何格式化和写入文本文件。有关详细信息,请参阅平面文件连接管理器 和平面文件目标

添加并配置平面文件目标

  1. 单击“数据流”选项卡。
  2. 在“SSIS 工具箱”中,展开“其他”,然后将“平面文件目标”拖动到数据流设计图面上。将“平面文件目标”直接放在“获取错误说明”转换的下面。
  3. 单击“获取错误说明”转换,然后将绿色箭头拖动到新的“平面文件目标”上。
  4. 在“数据流”设计图面上,在新添加的“平面文件目标”转换中单击“平面文件目标”,然后将该名称更改为 Failed Rows。
  5. 右键单击 Failed Rows 转换,再单击“编辑”,然后在平面文件目标编辑器中单击“新建”。
  6. 在“平面文件格式”对话框中,确认已选中“带分隔符”,然后单击“确定”。
  7. 在平面文件连接管理器编辑器的“连接管理器名称”框中,键入 Error Data。
  8. 在“平面文件连接管理器编辑器”对话框中,单击“浏览”,然后找到存储文件的文件夹。
  9. 在“打开”对话框中,对于“文件名”键入 ErrorOutput.txt,然后单击“打开”。
  10. 在“平面文件连接管理器编辑器”对话框中,验证“区域设置”框是否包含“英语(美国)”,“代码页”是否包含 1252 (ANSI -Latin I)。
  11. 在“选项”窗格中,单击“列”。请注意,除了源数据文件中的列之外,还存在三个新列:ErrorCode、ErrorColumn 和 ErrorDescription。这三列由 Lookup Currency Key 转换的错误输出和获取错误说明转换中的脚本生成,可用于排查失败行的原因。
  12. 单击“确定”。
  13. 在平面文件目标编辑器中,清除“覆盖文件中的数据”复选框。清除该复选框可使错误在执行多个包的过程中持续存在。
  14. 在平面文件目标编辑器中,单击“映射”来验证所有列是否正确。您也可以选择重命名目标中的列。
  15. 单击“确定”。

  

Step 5: 测试包

察看Error Output.txt文件

SSIS教程:创建简单的ETL包 -- 4. 增加错误处理流程(Adding Error Flow Redirection)的更多相关文章

  1. SSIS教程:创建简单的ETL包

    SSIS: Microsoft SQL Server Integration Services.是一个可用于生成高性能数据集成解决方案的平台,其中包括数据仓库的提取(Extract).转换(Trans ...

  2. SSIS教程:创建简单的ETL包 -- 2. 添加循环(Adding Looping)

    在第 1 课:创建项目和基本包中,创建了从单个平面文件源中提取数据的包,然后使用查找转换功能对数据进行了转换,最后将数据加载到AdventureWorksDW2012 示例数据库的 FactCurre ...

  3. SSIS教程:创建简单的ETL包 -- 1. 创建项目和基本包

    在本课中,将创建一个简单 ETL 包,该包可以从单个平面文件(Flat File)源中提取数据,使用两个查找转换组件转换该数据,然后将该数据写入AdventureWorksDW2012 的 FactC ...

  4. SSIS教程:创建简单的ETL包 -- 6. 对项目部署模型使用参数(Using Parameters with the Project Deployment Model)

    在本课中,将修改在第 5 课: 添加包部署模型的包配置中创建的包,以便使用项目部署模型.您将使用一个参数替换该配置值,以便指定示例数据位置.还可以复制本教程附带的已完成的 Lesson 5 包. 使用 ...

  5. SSIS教程:创建简单的ETL包 -- 3. 添加日志(Adding Logging)

    Microsoft Integration Services 包含日志记录功能,可通过提供任务和容器事件跟踪监控包执行情况以及进行故障排除. 日志记录功能非常灵活,可以在包级别或在包中的各个任务和容器 ...

  6. SSIS教程:创建简单的ETL包 -- 5. 添加包部署模型的包配置(Adding Package Configurations for the Package Deployment Model)

    包配置允许您从开发环境的外部设置运行时属性和变量. 配置允许您开发灵活且易于部署和分发的包.Microsoft Integration Services 提供了以下配置类型: XML 配置文件 环境变 ...

  7. 实例学习SSIS(一)--制作一个简单的ETL包

    原文:实例学习SSIS(一)--制作一个简单的ETL包 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SS ...

  8. Idea 2018.2.5创建springboot项目依赖包没有的错误

  9. Integration Services创建ETL包

    http://www.cnblogs.com/chiniao/archive/2009/12/23/1630595.html  (转载) Microsoft Integration Services ...

随机推荐

  1. Robolectric 单元测试中使用 Ressource

    单元测试类中: @RunWith(RobolectricGradleTestRunner.class) @Config(constants=BuildConfig.class, sdk = 21) 获 ...

  2. 未能加载文件或程序集“ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf116

    最近项目新增需求批量通过Excel导入数据,果断想到NPOI,结果导入的时候突然跳出 未能加载文件或程序集“ICSharpCode.SharpZipLib, Version=0.86.0.518, C ...

  3. python网络编程--FTP上传文件示例

    1.基础版(供学习了解原理使用,low) server服务端 import socket import struct import json server = socket.socket() ip_p ...

  4. 62 不同路径 leetcode JAVA

    题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 问 ...

  5. 关于CocoaPods添加第三方库造成项目崩溃

    在很多时候,我们接手了别人的代码,项目中已经使用cocoapods,但是再想通过pods添加第三方库时会造成崩溃,如果你没备份项目的话那你就悲催了,幸好当初用了git了,不然又够忙乎的了. 好,回到正 ...

  6. BZOJ2961: 共点圆(CDQ分治+凸包)

    题面 传送门 题解 这题解法真是多啊--据说可以圆反演转化为动态插入半平面并判断给定点是否在半平面交中,或者化一下改成给定点判断是否所有点都在某一个半平面内-- 鉴于圆反演我也不会,这里讲一下直接推的 ...

  7. 关于gcd和exgcd的一点心得,保证看不懂(滑稽)

    网上看了半天……还是没把欧几里得算法和扩展欧几里得算法给弄明白…… 然后想了想自己写一篇文章好了…… 参考文献:https://www.cnblogs.com/hadilo/p/5914302.htm ...

  8. Python面向对象(定义类和创建对象)

    day24 http://www.cnblogs.com/wupeiqi/p/4493506.html Python:函数式+面向对象,函数式编程可以做所有事,但是不一定合适. 小明,10岁,男,上山 ...

  9. 《快学Scala》第四章 映射与元组

  10. Linux安装yum的痛苦路程(失败,慎入)

    1,在网上下载了一个yum 的 rpm文件(yum-3.2.29-81.el6.centos.noarch.rpm),我在 http://www.rpmfind.net/linux/rpm2html/ ...