SSIS-加载位于SQL Server表中的CSV文件

时间:2019-04-11 16:14:55

标签: sql sql-server csv ssis

我需要解决我正在处理的任务。 我需要将多个CSV文件加载到sql server表中。 所有CSV都具有相同的结构。

CSV的源位于sql server表中。

SOURCE_TABLE结构。

ID -> Primary Key - IDENTITY
Path -> Varchar(100)

Source_Table数据

ID  Path
1   c:\1.csv
2   c:\2.csv
3   c:\x.csv
.
.
.
.

Target_Table结构(此表中没有主键)。

ID - INT     -> Foreign key from Source Table. (This is NOT primary key)
Date - Today Date&Time
1    --> All 1 through 5 are headers from CSV file. basically they are the contents from the csv file
2
3
4
5

目标表具有 TARGET_TABLE

ID      DateTime   <-and the columns from CSV file ->
1       Today      x  y  z  -> contents of c:\1.csv
1       Today      1  2  3  -> contents of c:\1.csv
1       Today      4  5  6  -> contents of c:\1.csv
1       Today      x  y  z  -> contents of c:\1.csv
2       today      sdf sdf sdf  -> contents of c:\2.csv
2       today      sdf sdf sdf  -> contents of c:\2.csv
2       today      sdf sdf sdf  -> contents of c:\2.csv
2       today      sdf sdf sdf  -> contents of c:\2.csv
2       today      sdf sdf sdf  -> contents of c:\2.csv
3       today      sdfs  sds  sdf  -> contents of c:\x.csv
3       today      sdfs  sds  sdf  -> contents of c:\x.csv
3       today      sdfs  sds  sdf  -> contents of c:\x.csv
3       today      sdfs  sds  sdf  -> contents of c:\x.csv
3       today      sdfs  sds  sdf  -> contents of c:\x.csv

以此类推...

TARGE_TABLE上的ID必须与SOURCE TABLE上的ID匹配

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

有关如何完成此操作的概述如下。假设您的问题表明所有CSV文件都具有相同的定义,则本示例将按照以下假设进行操作,并且目标表也包含具有相应的相应数据类型的列。

  • 创建三个变量。第一个具有int数据类型,可以称为ID。将第二个变量设置为字符串数据类型,并将其命名为FilePath或类似名称。对象数据类型将用于第三个变量,并且可以命名为FileList
  • 使用任何源文件的定义创建平面文件连接管理器。由于它将用于加载多个文件,因此文件路径(连接字符串)将需要动态。为此,请转到平面文件连接管理器属性(按F4),找到Expressions字段,然后按其旁边的省略号。在出现的窗口中,选择ConnectionString属性,然后选择创建的FilePath字符串变量。如果还没有,请为目标表所在的数据库创建一个OLE DB连接管理器。
  • 在控制流上添加执行SQL任务。对于SQL语句,输入一个SELECT命令,该命令按此顺序从源表返回ID和path列。在任务编辑器上,为Full Result Set属性选择ResultType选项。在“结果集”窗格上的“结果名称”列中输入0,然后在“变量名称”字段中添加对象变量(FileList)。
  • 接下来,在执行SQL任务之后添加一个Foreach循环,并将其连接到它。为枚举器字段选择Foreach ADO Enumerator选项。在“ ADO对象源变量”字段中,选择FileList对象变量。在“变量映射”选项卡上,在索引0处添加int变量(ID),在索引1处添加字符串FilePath变量。这会将行列从对象变量的当前迭代映射到其他列变量。尽管此命令与SELECT语句使用相同的顺序,即ID后跟路径列,但可以根据需要进行切换。
  • 在Foreach循环中创建一个数据流任务。使用先前定义的平面文件连接管理器添加平面文件源。接下来添加派生列转换。在此上,添加两个其他输出列。第一个输出列将是ID,并将int ID变量设置为具有int(DT_I4)数据类型的表达式。对于示例中目标表的datetime列,我假设您要导入文件的日期和时间。为此,在带有GETDATE()表达式的派生列转换上添加另一个输出列,以返回导入的日期和时间。这将具有DT_DBTIMESTAMP数据类型,该数据类型与SQL Server datetime日期类型相对应。如果此数据类型不同,请参见SSIS data type documentation中的映射表。
  • 在“派生列”之后添加OLE DB目标。将目标表设置为目标表,我建议使用“快速加载”选项,该选项可作为“批量插入”操作进行操作。在“映射”窗格上,将“ ID派生”列与目标表的ID列匹配,将“ datetime”派生列与与其相关联的目标表的列匹配,并将“平面文件源”的其余输出列与“目标文件”的适当列匹配。目标表。

有用的链接