Ja. Du vil gerne bruge en Foreach File Container og afkryds derefter indstillingen Gennemse undermappe.
Rediger
Tilsyneladende var mit svar ikke cromulent nok, så accepter venligst denne arbejdskode, som illustrerer, hvad mit korte originale svar sagde.
Kildedata
Jeg oprettede 3 mapper som beskrevet ovenfor for at indeholde filer sample1.txt
og sample2.txt
C:\>MKDIR SSISDATA\SO\TEST\201304
C:\>MKDIR SSISDATA\SO\TEST\201305
C:\>MKDIR SSISDATA\SO\TEST\201306
Indholdet af filen er nedenfor. Hver version af filen i hver mappe har id-værdien øget sammen med tekstværdierne ændret for at bevise, at den har hentet den nye fil.
ID,value
1,ABC
Pakkegenerering
Denne del forudsætter, at du har BIDS Helper installeret. Det er ikke påkrævet for løsningen, men giver blot en fælles ramme, som fremtidige læsere kan bruge til at reproducere denne løsning
Jeg oprettede en BIML-fil med følgende indhold. Selvom jeg har trin til oprettelse af tabellen derinde, var jeg nødt til at have den kørende på målserveren, før jeg genererede pakken.
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<!-- Create a basic flat file source definition -->
<FileFormats>
<FlatFileFormat
Name="FFFSrc"
CodePage="1252"
RowDelimiter="CRLF"
IsUnicode="false"
FlatFileType="Delimited"
ColumnNamesInFirstDataRow="true"
>
<Columns>
<Column
Name="ID"
DataType="Int32"
Delimiter=","
ColumnType="Delimited"
/>
<Column
Name="value"
DataType="AnsiString"
Delimiter="CRLF"
InputLength="20"
MaximumWidth="20"
Length="20"
CodePage="1252"
ColumnType="Delimited"
/>
</Columns>
</FlatFileFormat>
</FileFormats>
<!-- Create a connection that uses the flat file format defined above-->
<Connections>
<FlatFileConnection
Name="FFSrc"
FileFormat="FFFSrc"
FilePath="C:\ssisdata\so\TEST\201306\sample1.txt"
DelayValidation="true"
/>
<OleDbConnection
Name="tempdb"
ConnectionString="Data Source=localhost\dev2012;Initial Catalog=tempdb;Provider=SQLNCLI11.1;Integrated Security=SSPI;Auto Translate=False;"
/>
</Connections>
<!-- Create a package to illustrate how to apply an expression on the Connection Manager -->
<Packages>
<Package
Name="so_19957451"
ConstraintMode="Linear"
>
<Connections>
<Connection ConnectionName="tempdb"/>
<Connection ConnectionName="FFSrc">
<Expressions>
<!-- Assign a variable to the ConnectionString property.
The syntax for this is ConnectionManagerName.Property -->
<Expression PropertyName="FFSrc.ConnectionString">@[User::CurrentFileName]</Expression>
</Expressions>
</Connection>
</Connections>
<!-- Create a single variable that points to the current file -->
<Variables>
<Variable Name="CurrentFileName" DataType="String">C:\ssisdata\so\TEST\201306\sample1.txt</Variable>
<Variable Name="FileMask" DataType="String">*.txt</Variable>
<Variable Name="SourceFolder" DataType="String">C:\ssisdata\so\TEST</Variable>
<Variable Name="RowCountInput" DataType="Int32">0</Variable>
<Variable Name="TargetTable" DataType="String">[dbo].[so_19957451]</Variable>
</Variables>
<!-- Add a foreach file enumerator. Use the above -->
<Tasks>
<ExecuteSQL
Name="SQL Create Table"
ConnectionName="tempdb">
<DirectInput>
IF NOT EXISTS (SELECT * FROM sys.tables T WHERE T.name = 'so_19957451' and T.schema_id = schema_id('dbo'))
BEGIN
CREATE TABLE dbo.so_19957451(ID int NOT NULL, value varchar(20) NOT NULL);
END
</DirectInput>
</ExecuteSQL>
<ForEachFileLoop
Name="FELC Consume files"
FileSpecification="*.csv"
ProcessSubfolders="true"
RetrieveFileNameFormat="FullyQualified"
Folder="C:\"
ConstraintMode="Linear"
>
<!-- Define the expressions to make the input folder and the file mask
driven by variable values -->
<Expressions>
<Expression PropertyName="Directory">@[User::SourceFolder]</Expression>
<Expression PropertyName="FileSpec">@[User::FileMask]</Expression>
</Expressions>
<VariableMappings>
<!-- Notice that we use the convention of User.Variable name here -->
<VariableMapping
Name="0"
VariableName="User.CurrentFileName"
/>
</VariableMappings>
<Tasks>
<Dataflow Name="DFT Import file" DelayValidation="true">
<Transformations>
<FlatFileSource Name="FFS Sample" ConnectionName="FFSrc"/>
<RowCount Name="RC Source" VariableName="User.RowCountInput"/>
<OleDbDestination
Name="OLE_DST"
ConnectionName="tempdb">
<TableFromVariableOutput VariableName="User.TargetTable"/>
</OleDbDestination>
</Transformations>
</Dataflow>
</Tasks>
</ForEachFileLoop>
</Tasks>
</Package>
</Packages>
</Biml>
Højreklik på biml-filen og vælg Generate SSIS Package
. På dette tidspunkt bør du have en pakke med navnet so_19957451 tilføjet til dit nuværende SSIS-projekt.
Pakkekonfiguration
Der er ikke behov for nogen konfiguration, fordi det allerede er blevet gjort via BIML, men moar screenshots giver bedre svar.
Dette er grundpakken
Her er mine variabler
Konfiguration af Foreach Loop, som kaldet i MSDN-artiklen samt min note om at vælge Traverse-undermappen
Tildel værdien genereret pr. sløjfe til variablen Current
Den flade filkilde har et udtryk anvendt på ConnectionString-egenskaben for at sikre, at den bruger Variablen @User::CurrentFileName. Dette ændrer kilden pr. udførelse af løkken.
Udførelsesresultater
Resultater fra databasen
Match output fra pakkeudførelsen