SSIS - 使用匹配子字符串名称将文件动态移动到文件夹

时间:2017-06-16 14:29:05

标签: sql sql-server ssis etl

我正在使用foreach循环和文件系统任务将文件移动到特定文件夹(或至少尝试)。

文件名可以是100000,需要转到文件夹1000 文件102000需要转到文件夹1020 文件103000需要转到文件夹1030 等等 等

我正在努力解决如何将文件移动到正确的文件夹。

我以为我可以使用一个带有上层目录的变量,后跟foreach循环中保存的filename变量的子串

e.g。

"D:\\Archive\\" + SUBSTRING(@[USER::Variable],1,4)

但这不起作用,我得到一个错误,不支持路径格式。

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

您的问题

首先,我认为错误是因为变量不仅包含文件名的完整路径,因此您必须使用类似的表达式:

"D:\\Archive\\" + LEFT(RIGHT( @[User::Variable] , FINDSTRING(REVERSE( @[User::Variable] ) , "\\", 1) - 1),4)

详细解决方案

第一种方法 - 使用脚本任务

尝试使用脚本任务来实现此目的,只需在脚本任务中选择您的变量ReadOnlyVariable即可。并使用类似的脚本(I Used Vb.net)

Public Sub Main()

    Dim strFile As String = Dts.Variables.Item("User::Variable").ToString

    Dim strFilename As String = IO.Path.GetFileName(strFile)


    'Create Directory
    If Not IO.Directory.Exists("D:\Archive\" & strFilename.Substring(0, 4)) Then
        IO.Directory.CreateDirectory("D:\Archive\" & strFilename.Substring(0, 4))
    End If

    'Copy File to destination
    IO.File.Copy(strFile, "D:\Archive\" & strFilename.Substring(0, 4) & "\" & strFilename)

    Dts.TaskResult = ScriptResults.Success
End Sub

第二种方法 - 使用文件系统任务

创建一个新的变量@[User::DestinationPath]并设置它的属性Evaluate As Expression = True,然后使用以下表达式:

"D:\\Archive\\" + LEFT(RIGHT( @[User::Variable] , FINDSTRING(REVERSE( @[User::Variable] ) , "\\", 1) - 1),4)

变量截图

enter image description here

文件系统任务

enter image description here