如何在数据导入期间将平面文件中的dd-mmm-yy值格式化为smalldatetime?

时间:2011-08-25 20:18:43

标签: sql-server date ssis smalldatetime

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

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

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

2 个答案:

答案 0 :(得分:7)

以下示例可能会让您了解自己可以做些什么。理想情况下,在SSIS包或任何ETL作业中,您应该考虑到数据可能与您希望的不完全相同。您需要采取适当的步骤来处理可能会立即弹出的不正确或无效的数据。这就是SSIS在数据流任务中提出大量转换任务的原因,您可以利用它来清理数据。

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

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

File

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

Table

在SSIS包上,我有一个SQL连接管理器和一个Flat文件。平面文件连接配置如下所示。

Connection

Flat file 1

Flat file 2

Flat file 3

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

Derived column

如果执行此程序包,它将失败,因为文件中的所有值都不是有效的。

Failed

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

从Derived转换中拖动红色箭头并将其连接到Multicast转换。这将弹出Configure Error Output对话框。将错误和截断列下的值从失败组件更改为Redirect row。这会将任何错误行重定向到多播转换,并且不会进入表格。

Configure Error output

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

Success

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

希望能让您在SSIS包中实现您的需求。

Table data

答案 1 :(得分:3)

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

包裹是否出现错误或什么?