带有DateTime2列的SSIS数据流CSV到SQL Server

Ada*_*ger 7 sql-server ssis

我正在尝试通过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)...`
Run Code Online (Sandbox Code Playgroud)

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

Bac*_*its 5

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

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

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

因此,接下来,您将在数据流任务中正常创建平面文件数据源.接下来,添加派生列转换.编辑转换,为新列命名为"{SourceColumn}",将其配置为Add as a New Column,并格式化字符串并使用类似表达式对其进行类型化:

(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))
Run Code Online (Sandbox Code Playgroud)

我倾向于使用TechNet wiki页面中的SSIS表达式格式和SSIS doc for Casting格式,因为SSIS数据类型与SQL Server数据类型不同,即使它们映射得很干净.例如,DT_GUID需要大括号,而UNIQUEIDENTIFIER则不需要.

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