sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan importerer man tekstfiler med samme navn og skema, men forskellige mapper til databasen?

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




  1. Doktrine 2:cascade persist Oracle IDENTITY returnerer 0 som sidst indsatte ID

  2. Konvertering mellem ulogisk formaterede datoer (ændre /slash/ til -dash-)

  3. MyBatis-parameter fra HashMap

  4. ORA-00927:manglende lighedstegn