Ya. Anda akan ingin menggunakan Foreach File Container lalu centang opsi Traverse Subfolder.
Sunting
Rupanya jawaban saya tidak cukup cromulent, jadi terimalah kode kerja ini yang menggambarkan apa yang dinyatakan oleh jawaban asli singkat saya.
Data sumber
Saya membuat 3 folder seperti dijelaskan di atas untuk berisi file sample1.txt
dan sample2.txt
C:\>MKDIR SSISDATA\SO\TEST\201304
C:\>MKDIR SSISDATA\SO\TEST\201305
C:\>MKDIR SSISDATA\SO\TEST\201306
Isi filenya ada di bawah. Setiap versi file di setiap folder memiliki nilai ID yang bertambah bersama dengan nilai teks yang diubah untuk membuktikan bahwa file tersebut telah mengambil file baru.
ID,value
1,ABC
Pembuatan paket
Bagian ini mengasumsikan Anda memiliki BIDS Helper diinstal. Ini tidak diperlukan untuk solusi tetapi hanya menyediakan kerangka kerja umum yang dapat digunakan pembaca di masa mendatang untuk mereproduksi solusi ini
Saya membuat file BIML dengan konten berikut. Meskipun saya memiliki langkah membuat tabel di sana, saya harus menjalankannya di server target sebelum membuat paket.
<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>
Klik kanan pada file biml dan pilih Generate SSIS Package
. Pada titik ini, Anda harus memiliki paket bernama so_19957451 yang ditambahkan ke proyek SSIS Anda saat ini.
Konfigurasi paket
Tidak perlu konfigurasi apa pun karena sudah dilakukan melalui BIML tetapi tangkapan layar moar memberikan jawaban yang lebih baik.
Ini adalah paket dasar
Ini variabel saya
Konfigurasi Foreach Loop, seperti yang disebutkan dalam artikel MSDN serta catatan saya untuk memilih subfolder Traverse
Tetapkan nilai yang dihasilkan per loop ke variabel Current
Sumber file datar memiliki ekspresi yang diterapkan ke properti ConnectionString untuk memastikannya menggunakan Variabel @User::CurrentFileName. Ini mengubah sumber per eksekusi loop.
Hasil eksekusi
Hasil dari database
Cocokkan output dari eksekusi paket