Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

डेटाबेस में समान नाम और स्कीमा लेकिन विभिन्न निर्देशिकाओं के साथ टेक्स्ट फ़ाइलों को कैसे आयात करें?

हाँ। आप एक 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 का उपयोग करता है। यह लूप के प्रति निष्पादन के स्रोत को बदल देता है।

निष्पादन परिणाम

डेटाबेस से परिणाम

पैकेज निष्पादन से आउटपुट का मिलान करें




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं एक सबक्वायरी को #temp तालिका के साथ-साथ प्रदर्शन करने के लिए कैसे मजबूर कर सकता हूं?

  2. VBA कोड प्राथमिक कुंजी के साथ लिंक की गई तालिका को जोड़ने के लिए

  3. टेक्स्टबॉक्स टेक्स्ट को पूर्णांक में बदलें

  4. पैरामीटर varbinary डेटाटाइप में शून्य मान

  5. SQL सर्वर में टूटी हुई वस्तुओं का पता लगाएं