sql >> Databáze >  >> RDS >> Sqlserver

Jak importovat textové soubory se stejným názvem a schématem, ale různými adresáři do databáze?

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




  1. Převést „čas“ na „datetime2“ v SQL Server (příklady T-SQL)

  2. psql ERROR:Nelze otevřít soubor address.csv pro čtení:Žádný takový soubor nebo adresář

  3. PARSE() vs TRY_PARSE() v SQL Server:Jaký je rozdíl?

  4. Jak vytvořím dotaz UNION pomocí ORDER BY a GROUP BY v nástroji pro vytváření dotazů Kohana?