我正在尝试通过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
)正确导入?
扩大我的评论,因为这似乎是可以接受的答案:
我将在SSIS中使用派生列进行处理。它具有几个主要优点:首先,它使用与其余导入过程相同的解析方法,因此您不必担心解析字段。其次,它们都在内存中完成,因此您不必两次将数据写入磁盘。第三,它是由SSIS进行转换的,而不是SQL Server引擎,因此它不会遭受资源争用(特别是如果您的SSIS在另一台服务器上);第四,派生列使用同步流处理,这与它获得的速度差不多。
我这样做的方法是将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))
我倾向于将TechNet Wiki页面中的格式用于SSIS表达式,而将SSIS文档中的格式用于Casting,这仅仅是因为SSIS数据类型与SQL Server数据类型不同,即使它们映射得很干净。例如,DT_GUID需要花括号,而UNIQUEIDENTIFIER不需要。
以我的经验来看,这执行得很好。我目前使用此方法的唯一导入操作是在相当中等的硬件上运行的相当小的数据。它仅导入大约12,000条记录,但是每个记录大约4KB,具有约240个字段,并且正在转换其中的六个或七个。他们中的大多数人通过添加破折号和花括号将字符串转换为DT_GUID,但是其中之一正在纠正与此类似的格式错误的日期。包括数据写入在内的整个过程需要1-2秒。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句