Ano. Budete chtít použít Foreach File Container a poté zaškrtněte volbu Procházet podsložkou.
Upravit
Moje odpověď zjevně nebyla dostatečně obsáhlá, proto prosím přijměte tento pracovní kód, který ilustruje to, co uvedla má stručná původní odpověď.
Zdrojová data
Vytvořil jsem 3 složky, jak je popsáno výše, které obsahují soubory sample1.txt
a sample2.txt
C:\>MKDIR SSISDATA\SO\TEST\201304
C:\>MKDIR SSISDATA\SO\TEST\201305
C:\>MKDIR SSISDATA\SO\TEST\201306
Obsah souboru je níže. Každá verze souboru v každé složce má hodnotu ID inkrementovanou spolu s textovými hodnotami změněnými, aby bylo prokázáno, že vyzvedla nový soubor.
ID,value
1,ABC
Vytvoření balíčku
Tato část předpokládá, že máte Pomocníka nabídek nainstalováno. Pro řešení to není vyžadováno, ale pouze poskytuje společný rámec, který by budoucí čtenáři mohli použít k reprodukci tohoto řešení
Vytvořil jsem soubor BIML s následujícím obsahem. I když tam mám krok vytvoření tabulky, potřeboval jsem to spustit na cílovém serveru před vygenerováním balíčku.
<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>
Klikněte pravým tlačítkem na soubor biml a vyberte Generate SSIS Package
. V tomto okamžiku byste měli mít balíček s názvem so_19957451 přidaný do vašeho aktuálního projektu SSIS.
Konfigurace balíčku
Není potřeba žádná konfigurace, protože to již bylo provedeno pomocí BIML, ale snímky obrazovky moar poskytují lepší odpovědi.
Toto je základní balíček
Zde jsou mé proměnné
Konfigurace Foreach Loop, jak je uvedeno v článku MSDN, stejně jako moje poznámka o výběru podsložky Traverse
Přiřaďte hodnotu generovanou za smyčku proměnné Current
Zdroj plochých souborů má výraz použitý na vlastnost ConnectionString, aby bylo zajištěno, že používá proměnnou @User::CurrentFileName. Tím se změní zdroj při každém provedení smyčky.
Výsledky provedení
Výsledky z databáze
Porovnejte výstup z provádění balíčku