开篇介绍
在 SSIS 中操作文件的输入和输出是非常方便的,这个例子讲解一个最简单的需求:比如每天从数据库中查询一批数据要输出到文件,每天产生一个文件,那么文件的名称按照"文件名+日期"的格式加以区别,比如 Employee20131225.txt 。
测试案例
我的测试数据非常简单,就是一个查询语句,要将这些查出来的数据输出到文件并使用逗号分隔,每个文件根据时间加以区别。
SELECT EmployeeKey,
ParentEmployeeKey,
EmployeeNationalIDAlternateKey,
FirstName + ' '+ LastName AS FullName,
Title
FROM AdventureWorksDW2012.dbo.DimEmployee
新建一个 SSIS Package 并创建一个数据流,在数据流中使用上面的 SQL 查询语句创建一个数据源表,并且注意最下方先创建两个变量。一个变量表示输出的目录,一个变量表示输出的文件名称。在我之前的项目中,还包括输出的服务器地址,目录,分类然后再是输入的服务器地址,目录分类和文件名等等,这个例子只是简单演示。
新建一个平面文件输出 Flat File Destination 这时编辑 FF_DST_Employee 会提示创建文件连接管理器。
新建文件连接管理器, Overwrite data in the file 是指如果同名文件将覆盖,这个选项很有用,因为有的场景需要你追写文件。
Delimited - 逗号分隔,这个格式最为方便,无论是加载还是输出,格式都是非常方便管理和配置的。当然也有的需要输出成 Fixed width 定长,那么就需要为每一个输出列指定输出的宽度。
定义好连接管理器的名称,并且在 File Name 那里浏览到一个目录并填写一个文件名称,这个文件不需要存在,因为在输出的时候会自动创建。
文件输出是逗号分隔,连格式转换都省略掉了,不用管。
Mapping 是数据源和连接管理器的 Data Mapping ,由于连接管理器是根据上游数据源创建的,所以格式都一样。
保存并运行 Package ,执行成功。
文件已经输出了,数据和格式都没有问题。
这个时候就要开始处理文件的命名了,选择好文件连接管理器并右键属性,找到 Expressions - 这里面提供了大量可配置的选项。
ConnectionString 就是我们要编辑的对象,它指定了平面连接管理器的连接到输出文件的路径。
将我们自定义的两个变量拼接成字符串看看,路径斜杠用 "\\" 表示,点击计算表达式看看实际的路径。也就是说平面连接管理器的路径将由这两个变量来决定了,变量是什么值,路径便是什么。 在这个例子中,其实可以完全不需要使用到这两个变量,但是这是我们处理文件时通常所采用的一种规范的做法,原因就是我们输出的文件地址可能会发生改变,所以这些都是最终需要配置的。
文件名根据时间来计算,我使用到了一些小函数来进行格式转换,这个文字的正下方有很多文件夹 (Mathematical Functions. String Functions),提供了很多的小函数。
@[User::VarOutputFolder]+"\\"+ @[User::VarOutputFileName]+(DT_STR,4,1252)DATEPART( "yyyy" , @[System::StartTime] ) +
RIGHT("0" + (DT_STR,4,1252)DATEPART( "mm" ,@[System::StartTime] ), 2) +
RIGHT("0" + (DT_STR,4,1252)DATEPART( "dd" , @[System::StartTime] ), 2) +".txt"
点击计算就能看到计算出来的地址是根据当前运行时间决定的,当然最后的路径不正确。那是因为我们的文件名变量是 Employee.txt,因此最后文件名变成了以 Employee.txt20131224.txt 命名的方式。
要改的话非常容易,将文件名称的变量改成 Employee并保存,然后重新打开连接管理器的表达式看看输出的文件名称就是正确的了。
保存并执行 Package,并将当前系统时间修改为明天再执行。
最终就看到两个文件输出了,名称是根据今天的日期和明天的日期决定的。