SSIS-加载位于SQL Server表中的CSV文件
我需要解决我正在做的任务。 我需要将多个CSV文件加载到sql server表中。 所有CSV都具有相同的结构SSIS-加载位于SQL Server表中的CSV文件,sql,sql-server,csv,ssis,Sql,Sql Server,Csv,Ssis,我需要解决我正在做的任务。 我需要将多个CSV文件加载到sql server表中。 所有CSV都具有相同的结构 ID -> Primary Key - IDENTITY Path -> Varchar(100) CSV的源位于sql server表中 源表结构 ID -> Primary Key - IDENTITY Path -> Varchar(100) 源表数据 ID Path 1 c:\1.csv 2 c:\2.csv 3 c:\x.csv .
ID -> Primary Key - IDENTITY
Path -> Varchar(100)
CSV的源位于sql server表中
源表结构
ID -> Primary Key - IDENTITY
Path -> Varchar(100)
源表数据
ID Path
1 c:\1.csv
2 c:\2.csv
3 c:\x.csv
.
.
.
.
目标_表结构(此表中没有主键)
目标表已被删除
目标表
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
ID日期时间
1今天x y z->c:\1.csv的内容
1今天1 2 3->c:\1.csv的内容
1今天4 5 6->c:\1.csv的内容
1今天x y z->c:\1.csv的内容
2今天的sdf sdf->c:\2.csv的内容
2今天的sdf sdf->c:\2.csv的内容
2今天的sdf sdf->c:\2.csv的内容
2今天的sdf sdf->c:\2.csv的内容
2今天的sdf sdf->c:\2.csv的内容
3今天sdfs sds sdf->c:\x.csv的内容
3今天sdfs sds sdf->c:\x.csv的内容
3今天sdfs sds sdf->c:\x.csv的内容
3今天sdfs sds sdf->c:\x.csv的内容
3今天sdfs sds sdf->c:\x.csv的内容
等等
TARGE_表上的ID必须与源表上的ID匹配
感谢您的帮助。下面是如何完成此任务的概述。假设您的问题表明所有CSV文件共享相同的定义,本例采用以下假设,并且目标表也包含具有相应数据类型的列
- 创建三个变量。第一个具有int数据类型,可以称为
。将第二个变量设为字符串数据类型,并将其命名为ID
或类似名称。对象数据类型将用于第三个变量,它可以命名为FilePath
FileList
- 使用任何源文件的定义创建平面文件连接管理器。由于它将用于加载多个文件,因此文件路径(连接字符串)需要是动态的。要执行此操作,请转到平面文件连接管理器属性(按
),找到F4
字段,然后按旁边的省略号。在出现的窗口中,选择表达式
属性,然后选择创建的ConnectionString
字符串变量。如果还没有,还可以创建一个到目标表所在数据库的OLE DB连接管理器FilePath
- 在控制流上添加执行SQL任务。对于SQL语句,输入一个
命令,该命令按此顺序从源表返回ID和path列。在任务编辑器上,为SELECT
属性选择ResultType
选项。在“结果集”窗格的“结果名称”列中输入0,然后在“变量名称”字段中添加对象变量(Full Result Set
)FileList
- 接下来,在executesql任务之后添加一个Foreach循环,并将其连接到它。为枚举器字段选择
选项。在ADO对象源变量字段中,选择Foreach ADO枚举器
对象变量。在变量映射选项卡上,在索引0处添加int变量(文件列表
),在索引1处添加stringID
变量。这将把行的列从对象变量的当前迭代映射到其他变量。虽然这与FilePath
语句的顺序相同,即ID后面跟path列,但如果需要,可以对其进行切换SELECT
- 在Foreach循环内创建数据流任务。使用先前定义的平面文件连接管理器添加平面文件源。接下来添加一个派生列转换。在此基础上,添加两个额外的输出列。第一个输出列将是ID,并将int
变量设置为具有int(ID
)数据类型的表达式。对于示例中目标表的datetime列,我假设您需要导入文件的日期和时间。为此,使用DT_I4
表达式在派生列转换上添加另一个输出列,以返回导入的日期和时间。这将具有与SQL Server日期时间类型相对应的GETDATE()
数据类型。如果此数据类型不同,请参阅中的映射表DT_DBTIMESTAMP
- 在派生列之后添加OLE DB目标。将目标表设置为目标,我建议使用Fast Load选项,该选项作为批量插入操作。在“映射”窗格上,将ID派生列与目标表的ID列相匹配,将datetime派生列与其关联的目标表的列相匹配,将平面文件源的其余输出列与目标表的相应列相匹配
ID
值是来自CSV文件的文件名,还是CSV文件中的数据?如果您发布了Target_table
的实际表定义以及其中一个CSV文件的前几行,这将非常有用。源_table的ID为IDENTITY。目标_表的ID是源_表的ID。目标_表中的ID不是主键。请再次发布目标_表
的实际表定义以及CSV文件中的一些示例行。记住——我们对你所做的事情远没有你熟悉。有关如何发布有效问题的更多指导,请参见和。@brian-我刚刚更新了问题。