如题,之所以写这篇随笔,是因为之前一直是学习AND使用的是SSIS 2008,对SSIS 2005的一些控制流工具使用细节上不是很熟悉(SSIS 2008和2005是有些区别的),写下这篇随笔来警示自己和博客园的诸位兄弟。
OK,下面进入正题。
需求:F:\Inbound目录里面每天会产生以GR_PRICECOMPARE+日期时间格式命名的TXT文件,要求将其中的数据导入到指定的数据库表中,并且每天会产生不定数量的这种文件。
开发工具:VS2005/MS SQL2005
使用技术:Microsoft Integration Services
1、声明两个变量:
iRead是循环变量,iCount是循环次数,这里的iCount取值是F:\Inbound目录下的txt文件的数量。
2、给iCount赋值
这里用的组建是“脚本任务”,首先在工具箱中托一个“脚本任务”的组建到设计界面,然后在上面右击编辑,出现下面画面:
注意:在ReadWriteVariables右边放的是变量iCount,在2005中式这样写的,但是在2008变量的格式是User::iCount,如果是系统变量,则需要将User换成System,多个变量同样是用‘,’隔开。
然后点击“设计脚本”开始编写脚本(注:2005中只能用VB.NET编写脚本,2008中可以用VB.NET和C#.NET编写脚本),下面是脚本编辑页面:
这一步做的主要是找出F:\Inbound目录下以GR_PRICECOMPARE+日期时间格式命名的TXT文件的数量,代码如下:
Dim path As String
Dim searchPattern As String
Dim importFiles As String()
path = "F:\Inbound"
searchPattern = "GR_PRICECOMPARE*.txt"
importFiles = Directory.GetFiles(path, searchPattern)
If importFiles.Length = 0 Then
Dts.Variables("iCount").Value = 0
Dts.TaskResult = Dts.Results.Failure
Return
Else
Dts.Variables("iCount").Value = importFiles.Length
Dts.TaskResult = Dts.Results.Success
End If
End Sub
3、For循环编辑器
这一步首先在工具箱里面托一个For循环编辑器到设计界面上,For循环编辑器是一个非常简单好用的循环编辑器,下面看使用方法:
右击编辑FOR循环容器:
InitExpression是对循环中使用的变量进行初始化
EvalExpression是要求指定一个表达式,当表达式结果为False时候,循环终止
AssignExpression是指定执行一次循环之后,变量的值改变规则
注意:这里的变量书写方式@iRead
OK,For循环设定就是如此简单。
4、备份TXT文件
继续托一个“脚本任务”到设计窗口中,编写脚本程序如下:
Dim path As String
Dim newPath As String
Dim searchPattern As String
Dim importFiles As String()
Dim art As String()
Dim datestr As String = ""
datestr = Format(Now(), "yyyy-MM")
newPath = "F:\Backup\" + datestr
If System.IO.Directory.Exists(newPath) = False Then
System.IO.Directory.CreateDirectory(newPath)
End If
'FTP 路径
path = "F:\Inbound"
searchPattern = "GR_PRICECOMPARE*.txt"
importFiles = Directory.GetFiles(path, searchPattern)
'找不到文件!
If importFiles.Length = 0 Then
Dts.TaskResult = Dts.Results.Failure
Return
End If
'找到多个类似的文件
If importFiles.Length > 0 Then
art = importFiles(0).Split(CChar("\"))
File.Copy(importFiles(0), newPath + "\" + art(art.Length - 1), True)
File.Move(importFiles(0), path + "\GR_PRICECOMPARE.txt")
End If
Dts.TaskResult = Dts.Results.Success
End Sub
5、读取TXT文件中的数据
新建一个平面文件链接如下:
下面是在没有选择第一行是列名的情况下,列名是默认从"列1—列N"
下面要从工具箱中托一个数据流组建到设计窗口界面:
平面文件源的链接就选择我们刚建好的平面文件链接(GR_PRICECOMPARE)
下面再建一个与数据库链接的OLEDB链接,就OK了(这个比较简单,这里就不在敖述)
然后我们右击OLEDB目标编辑,看看文本文件和数据库表各列的映射情况:
6、删除GR_PRICECOMPARE.txt文件
因为平面文件连接器是和这个文件链接的,而原文件名是GR_PRICECOMPARE+日期时间组成的,在循环第一步是先将该文件备份,然后将名称改成GR_PRICECOMPARE.txt,这样也是为了平面文件链接器方便链接,最后一步当然是删除GR_PRICECOMPARE.txt,然后进入下一次循环,将下一个原文件名称转换成GR_PRICECOMPARE.txt,直到原始文件读取完为止。
7、安装部署
将开发完的包安装部署到SQL 2005上面就OK了,然后设定job运行时间,我这里是每天一次。