【问题标题】:SSIS Dataflow CSV to SQL Server with DateTime2 columnSSIS 数据流 CSV 到带有 DateTime2 列的 SQL Server
【发布时间】:2015-05-05 20:20:22
【问题描述】:

我正在尝试通过 SSIS 数据流任务将平面文件加载到 SQL Server 中。至于文件,我得到这个形状的列20140311115000,如果我打开Fast Parse: False,如果我将列更改为2014-03-11 11:50:00,我可以得到要导入的列。虽然这不是最优的,因为我无法控制我们提供的上游文件,而且我宁愿不解析每一列/行/表。在我的文件连接中,我将列定义为:DT_DBTIMESTAMP2。在压缩格式中,我收到以下错误:

[ADO NET Destination [2]] Error: System.ArgumentOutOfRangeException:
Year, Month, and Day parameters describe an un-representable DateTime.
at System.DateTime.DateToTicks(Int32 year, Int32 month, Int32 day)...`

有没有办法正确导入较短的列格式 (20140311115000)?

【问题讨论】:

  • 您知道真正令人敬畏的是 2008 SSIS 不会失败。我明白了jacked error message in the column itself
  • 如果您可以说服上游提供商将值修改为 20140311T115000,那么为这些列设置 FastParse = true 将允许它作为 DT_DBTIMESTAMP2 本地导入
  • 感谢@billinkc 的那个选项;它比我知道 Fast Parse 也可以处理的其他形状稍微不那么激烈:2014-03-11 11:50:00
  • 您可以将其导入临时表中的 varchar 列,然后使用 SQL 任务对其进行解析并将其转换为目标表中的时间戳。
  • 我不知道这是否是您特别想避免的,或者我会将其作为答案发布。我会将 CSV 文件中的字段定义为字符串字段。然后我会创建一个派生列来用表达式格式化字符串并将其转换为DT_DBTIMESTAMP2。然后我会用它来导入数据库。你可以找到一个类似的例子here

标签: sql-server ssis


【解决方案1】:

扩展我的 cmets,因为这似乎是一个可以接受的答案:

我会在 SSIS 中使用派生列来处理这个问题。它有几个主要优点:首先,它使用与导入过程的其余部分相同的解析方法,因此您不必担心解析字段;其次,这一切都在内存中完成,因此您不会将数据两次写入磁盘;第三,是 SSIS 进行转换,而不是 SQL Server 引擎,因此它不会遭受资源争用(特别是如果您的 SSIS 在另一台服务器上);四,Derived Columns use synchronous stream processing,速度差不多。

我这样做的方法是将 CSV 文件中的字段定义为长度为 14 的字符串 (DT_STR)。我倾向于将 CSV 的输入列重命名为“{SourceColumn}_STR”或“{SourceColumn}_RAW ",因为您需要具有唯一的输入和输出列名称,这让我稍后可以使用 "{SourceColumn}" 作为派生列的名称。 IMO,这使得映射目的地变得更加容易。如果您没有更改数据类型,则可以通过替换列来摆脱困境,但如果您更改数据类型,则还必须给它一个新的列名,AFAIK。

因此,接下来您在数据流任务中照常创建平面文件数据源。接下来,添加派生列转换。编辑转换,将新列命名为“{SourceColumn}”,将其配置为添加为新列,然后格式化字符串并使用如下表达式进行类型转换:

(DT_DBTIMESTAMP2, 2)(SUBSTRING(MyDateColumn,1,4) + "-" + SUBSTRING(MyDateColumn,5,2) + "-" + SUBSTRING(MyDateColumn,7,2) + " " + SUBSTRING(MyDateColumn,9,2) + ":" + SUBSTRING(MyDateColumn,11,2) + ":" + SUBSTRING(MyDateColumn,13,2))

我倾向于使用来自the TechNet wiki page for SSIS expressionsthe SSIS doc for Casting 的格式,仅仅是因为SSIS 数据类型与SQL Server 数据类型不同,即使它们映射干净。例如,DT_GUID 需要花括号,而 UNIQUEIDENTIFIER 不需要。

根据我的经验,这表现得非常好。我目前使用这种方法的唯一导入是在相当中等的硬件上运行的相当小的。它只导入了大约 12,000 条记录,但每条记录大约 4KB 并且有大约 240 个字段,并且它正在转换其中的六七个。他们中的大多数通过添加破折号和花括号将字符串转换为 DT_GUID,但其中之一是更正与此类似的格式错误的日期。包括数据写入在内的整个过程需要1到2秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多