每个文件枚举器中的SSIS文件筛选器

时间:2018-01-02 20:06:05

标签: sql-server ssis etl

我有一个For For file Enumerator。在我有E:\Input

的文件夹下

在我有"*" + @[User:Date] + "*.*"

的文件下

日期变量设置为20180101

变量映射设置为User::FileToBeMoved

在枚举器中,我有一个文件系统移动文件,其中Source是变量User::FileToBeMoved,目标是包含E:\Input\Archive的变量

我的文件有In20180101.txtIntermediate20180101.txtOut20180101.txt

文件未被移动。看起来它没有识别过滤器"*" + @[User:Date] + "*.*"

如果我进入Windows资源管理器并将*20180101*.*放在搜索框中,它会完全符合我的要求,向我显示包含20180101的3个文件

有人可以告诉我为什么这不适用于SSIS吗?

谢谢,

迪克

1 个答案:

答案 0 :(得分:0)

“文件”部分提供了通用

您需要在FileSpec

中指定表达式

enter image description here

我发现更容易创建一个执行逻辑的变量而不是将其嵌入到容器中,因为您可以检查变量中的值而不是任务。

使用BIML的解决方案

如果您使用Biml,这将创建一个包,其中包含基于变量DateString的值将表达式应用于For Each File Enumerator的文件规范的所有工作。

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Packages>
        <Package Name="so_48067171">
            <Variables>
                <Variable Name="Date" DataType="String">20180101</Variable>
                <Variable Name="DateString" DataType="String" EvaluateAsExpression="true">"*" + @[User::Date] + "*"</Variable>
                <Variable Name="CurrentFile" DataType="String">Demo.txt</Variable>
                <Variable Name="ArchiveFolder" DataType="String">C:\ssisdata\archive</Variable>
            </Variables>
            <Tasks>
                <ForEachFileLoop Name="FELC TodayFiles" Folder="C:\ssisdata\input" FileSpecification="*.txt" >
                    <VariableMappings>
                        <VariableMapping Name="0" VariableName="User.CurrentFile" />
                    </VariableMappings>
                    <Expressions>
                        <Expression ExternalProperty="FileSpec">@[User::DateString]</Expression>
                    </Expressions>
                        <Tasks>
                           <FileSystem Name="FST Archive file" Operation="MoveFile" >
                               <VariableInput VariableName="User.CurrentFile" />
                               <VariableOutput VariableName="User.ArchiveFolder" />
                           </FileSystem>
                        </Tasks>
                </ForEachFileLoop>
            </Tasks>
        </Package>
    </Packages>
</Biml>

您的TODO将根据当前日期或日期减去一个来设置@ [User :: Date]的值。