हाँ। आप एक Foreach फ़ाइल कंटेनर का उपयोग करना चाहेंगे और फिर ट्रैवर्स सबफ़ोल्डर विकल्प की जाँच करें।
संपादित करें
स्पष्ट रूप से मेरा उत्तर पर्याप्त नहीं था, इसलिए कृपया इस कार्य कोड को स्वीकार करें जो दर्शाता है कि मेरे संक्षिप्त मूल उत्तर में क्या कहा गया है।
स्रोत डेटा
sample1.txt
files फ़ाइलों को शामिल करने के लिए मैंने ऊपर वर्णित अनुसार 3 फ़ोल्डर बनाए हैं और sample2.txt
C:\>MKDIR SSISDATA\SO\TEST\201304
C:\>MKDIR SSISDATA\SO\TEST\201305
C:\>MKDIR SSISDATA\SO\TEST\201306
फ़ाइल की सामग्री नीचे है। प्रत्येक फ़ोल्डर में फ़ाइल के प्रत्येक संस्करण में आईडी मान में वृद्धि हुई है और टेक्स्ट मानों को यह साबित करने के लिए बदल दिया गया है कि उसने नई फ़ाइल उठाई है।
ID,value
1,ABC
पैकेज जनरेशन
यह भाग मानता है कि आपके पास BIDS हेल्पर है स्थापित। समाधान के लिए इसकी आवश्यकता नहीं है, लेकिन यह केवल एक सामान्य ढांचा प्रदान करता है जिसे भविष्य के पाठक इस समाधान को पुन:पेश करने के लिए उपयोग कर सकते हैं
मैंने निम्नलिखित सामग्री के साथ एक BIML फ़ाइल बनाई। भले ही मेरे पास टेबल बनाने का चरण है, मुझे पैकेज बनाने से पहले लक्ष्य सर्वर पर इसे चलाने की आवश्यकता है।
<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>
biml फ़ाइल पर राइट क्लिक करें और Generate SSIS Package
चुनें . इस बिंदु पर, आपके पास अपने वर्तमान SSIS प्रोजेक्ट में so_19957451 नाम का एक पैकेज जोड़ा जाना चाहिए।
पैकेज कॉन्फ़िगरेशन
किसी कॉन्फ़िगरेशन की कोई आवश्यकता नहीं है क्योंकि यह पहले से ही BIML के माध्यम से किया जा चुका है लेकिन मोर स्क्रीनशॉट बेहतर उत्तर के लिए बनाते हैं।
यह मूल पैकेज है
ये रहे मेरे वेरिएबल
Foreach लूप का कॉन्फ़िगरेशन, जैसा कि MSDN आलेख में कहा गया है और साथ ही ट्रैवर्स सबफ़ोल्डर का चयन करने का मेरा नोट
प्रति लूप जेनरेट किए गए मान को वेरिएबल करेंट पर असाइन करें
फ्लैट फ़ाइल स्रोत में कनेक्शनस्ट्रिंग प्रॉपर्टी पर एक अभिव्यक्ति लागू होती है ताकि यह सुनिश्चित किया जा सके कि यह वैरिएबल @User::CurrentFileName का उपयोग करता है। यह लूप के प्रति निष्पादन के स्रोत को बदल देता है।
निष्पादन परिणाम
डेटाबेस से परिणाम
पैकेज निष्पादन से आउटपुट का मिलान करें