描述:远程主机每天不定期产生N多个xls文件,已在远程主机建立FTP服务器,本地通过FTP不定时下载这些xls文件。
想法:下载过的文件,不应再下载。那应该记录哪些文件已下载过。简单的可以通过比较文件名的方式。得到远程主机FTP目录下的xls文件,跟本地已下载文件比较,得到不存在的文件名。其后将此不存在的文件下载到本地。
此处没有将xls文件按日期分文件夹存储,请自行扩展。
方法:通过使用SSIS动几下鼠标完成此任务。
步骤:
一. 新建一个SSIS项目。
二. 新建一个“FTP连接管理器”填写好服务器名称,端口,用户名和密码。三. 新建变量,如图vFTPFiles 为 FTP 服务器目录下的文件列表,为XML格式
vFile 为 循环时使用的变量,为不存在的文件
vFTPExtension 在FTP服务器目录下查找文件的扩展名
vFTPWorkingDirectory 为FTP服务器下的目录,默认为根目录
vLocalPath 为本地保存文件的路径
vResultMatchFiles 为存储过程返回的ADO结果集vFTPRemoteFile 为FTP下的文件名。格式为 \目录名\文件名
需要将vFTPRemoteFile的EvaluateAsExpression 属性设置为true
然后将Expression属性设置为
@[用户::vFTPWorkingDirectory] +  @[用户::vFile]四. 新建一个脚本任务。
将ReadOnlyVariables设置为vFTPWorkingDirectory,vFTPExtension
将ReadWriteVariable 设置为vFTPFiles进入脚本编辑器
输入以下VB.NET脚本' Microsoft SQL Server Integration Services Script Task
' Write scripts using Microsoft Visual Basic
' The ScriptMain class is the entry point of the Script Task.Imports System
Imports System.Data
Imports System.Math
Imports System.Text
Imports Microsoft.SqlServer.Dts.RuntimePublic Class ScriptMain ' The execution engine calls this method when the task executes.
' To access the object model, use the Dts object. Connections, variables, events,
' and logging features are available as static members of the Dts class.
' Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.

' To open Code and Text Editor Help, press F1.
' To open Object Browser, press Ctrl+Alt+J. Public Sub Main()
        Dim ftpMng As ConnectionManager = Dts.Connections("FTP")        Dim ftpClient As FtpClientConnection = New FtpClientConnection(ftpMng.AcquireConnection(Nothing))        Dim ftpFolders() As String, ftpFiles() As String        With ftpClient
            .Connect()
            .SetWorkingDirectory(Dts.Variables("vFTPWorkingDirectory").Value.ToString())
            .GetListing(ftpFolders, ftpFiles)
        End With        ftpClient.Close()        Dim resultXml As New StringBuilder
        resultXml.Append("<files>")        Dim pattern As String = Dts.Variables("vFTPExtension").Value.ToString        For i As Integer = 0 To ftpFiles.GetUpperBound(0)
            If pattern = ".*" Then
                resultXml.Append("<file>" + ftpFiles(i).ToString() + "</file>")
            Else
                If ftpFiles(i).EndsWith(pattern) Then
                    resultXml.Append("<file>" + ftpFiles(i).ToString() + "</file>")
                End If
            End If
        Next        resultXml.Append("</files>")        Dts.Variables("vFTPFiles").Value = resultXml.ToString()        Dts.TaskResult = Dts.Results.Success
    End SubEnd Class五. 在dbTest(用户自行新建)数据库下,新建存储过程
CREATE PROCEDURE dbo.MatchFiles
    @pattern varchar(50)='.*',       --扩展名
    @path varchar(256),              --本地路径
    @files xml                       --xml格式文件列表
AS
    DECLARE @tmp TABLE(filename varchar(256));
    DECLARE @cmd nvarchar(4000);    SET @cmd = 'dir ' + @path + '*' + @pattern + ' /B';    INSERT @tmp EXEC master..xp_cmdshell @cmd;
    DELETE @tmp WHERE filename IS NULL;    
    SELECT B.filename
    FROM @tmp AS A
        RIGHT JOIN (SELECT T.x.value('.','varchar(50)') AS filename
                   FROM @files.nodes('//file') AS T(x)) AS B
    ON A.filename = B.filename 
    WHERE A.filename IS NULL;
    
GO六,新建一个“执行SQL任务”
常规页面中如下设置Connection为自行建立的ADO.NET连接管理器,在此不多说。在参数映射中设置如下:在结果集中设置如下:
六. 新建一个“Foreach循环容器”
枚举器为“ADO 枚举器”,变量设置为vResultMatchFiles
参数映射中设置如下:七. 在FOREACH循环容器内新建一个“FTP任务”
FTP任务设置如下:
完成图如下:
http://hi.csdn.net/attachment/201008/19/90661_1282178686Zw5h.jpg执行: