【问题标题】:How do I format dd-mmm-yy values in flat file to smalldatetime during data import?如何在数据导入期间将平面文件中的 dd-mmm-yy 值格式化为 smalldatetime?
【发布时间】:2011-08-25 20:18:42
【问题描述】:

我有一个通过现有 SSIS 包导入 SQL Server 的平面文件。我需要对包进行更改以适应平面文件中的新字段。新字段是格式为dd-mmm-yy 的日期字段(例如25-AUG-11)。平面文件中的日期字段将为空(例如空格/空格)或填充日期。我无法控制平面文件中的日期格式。

我需要将平面文件中的日期字段导入到现有的 SQL Server 表中,目标字段数据类型为 smalldatetime。

我建议将日期作为字符串导入加载表中,然后在从加载表中获取数据时转换为 smalldatetime。但是是否有另一种可能的方法来解析日期格式 dd-mmm-yy 以将其直接加载到 smalldatetime 字段中,而无需从加载表中使用 convert to smalldatetime 。我不太想知道如何解析日期格式,尤其是月份。欢迎提出任何建议。

【问题讨论】:

    标签: sql-server date ssis smalldatetime


    【解决方案1】:

    下面是一个示例,可以让您了解您可以做什么。理想情况下,在 SSIS 包或任何 ETL 作业中,您应该考虑到数据可能并不完全符合您的期望。您需要采取适当的步骤来处理可能不时弹出的不正确或无效数据。这就是为什么 SSIS 在数据流任务中提出了许多转换任务,您可以利用这些任务来清理数据。

    在您的情况下,您可以使用Derived Column 转换或Data conversion 转换来满足您的要求。

    示例创建于SSIS 2008 R2。它展示了如何读取包含日期的平面文件并加载到 SQL 表中。

    我创建了一个简单的 SQL 表来导入平面文件数据。

    在 SSIS 包中,我有一个连接到 SQL 的连接管理器和一个用于平面文件的连接管理器。平面文件连接配置如下图。

    在 SSIS 包上,我在控制流选项卡上放置了一个数据流任务。在数据流任务内部,我有一个平面文件源、派生列转换和一个 OLE DB 目标。由于平面文件源和 OLE DB 目标很简单,我将把它们放在这里。派生转换使用表达式(DT_DBDATE)SmallDate 创建一个新列。请注意,您也可以使用数据转换转换来执行相同的操作。这个新列 SmallDateTimeValue 应该映射到 OLE DB Destination 中的数据库列。

    如果你执行这个包,它会失败,因为不是文件中的所有值都是有效的。

    在您的情况下它失败的原因是因为无效数据被直接插入到表中。在您的情况下,该表将引发异常,使包失败。在此示例中,包失败,因为派生列转换的默认设置是在出现任何错误时使组件失败。因此,让我们放置一个虚拟转换来重定向错误行。我们将为此目的进行组播转换。它真的不会做任何事情。理想情况下,您应该使用 OLE DB Destination 或您选择的其他 Destination 组件将错误行重定向到另一个表,以便分析导致错误的数据。

    从派生转换中拖动红色箭头并将其连接到多播转换。这将弹出配置错误输出对话框。将错误和截断列下的值从 Fail component 更改为 Redirect row。这会将任何错误行重定向到多播转换,并且不会进入表中。

    现在,如果我们执行包,它将成功运行。注意每个方向显示的行数。

    这是进入表格的数据。只有 2 行有效。您可以查看显示文件中数据的第一个屏幕截图,您可以看到只有 2 行有效。

    希望能给你一个想法,在 SSIS 包中实现你的要求。

    【讨论】:

    • 截图很棒,+1
    【解决方案2】:

    它应该直接加载到 SMALLDATETIME 字段中。请记住,日期只是 SQL Server 中的数字,它们以所需的日期/时间格式呈现给用户。 SSIS 包应将 25-AUG-2011 读取为日期数据类型,并将其插入到 SMALLDATETIME 字段中没有问题。

    包是抛出错误还是什么?

    【讨论】:

    • 包抛出转换错误,但有人告诉我这可能是因为记录是空格/空白,所以我需要检查它们并插入 NULL(DT_DATE)。
    猜你喜欢
    • 2021-07-20
    • 2018-04-30
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多