sql >> データベース >  >> RDS >> Sqlserver

名前とスキーマが同じでディレクトリが異なるテキストファイルをデータベースにインポートする方法は?

    はい。 Foreach ファイル コンテナー を使用する必要があります。 次に、[サブフォルダーのトラバース] オプションをオンにします。

    編集

    どうやら私の答えは十分に複雑ではなかったので、私の簡単な元の答えが述べたことを示すこの作業コードを受け入れてください.

    ソース データ

    上記のように、ファイル sample1.txt を含む 3 つのフォルダーを作成しました。 および sample2.txt

    C:\>MKDIR SSISDATA\SO\TEST\201304
    C:\>MKDIR SSISDATA\SO\TEST\201305
    C:\>MKDIR SSISDATA\SO\TEST\201306
    

    ファイルの内容は以下です。各フォルダ内のファイルの各バージョンには、新しいファイルを取得したことを証明するために変更されたテキスト値とともに ID 値が増分されます。

    ID,value
    1,ABC
    

    パッケージの生成

    このパートでは、BIDS Helper があることを前提としています。 インストールされています。ソリューションに必須ではありませんが、将来の読者がこのソリューションを再現するために使用できる共通のフレームワークを提供するだけです

    以下の内容の 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 を選択します。 .この時点で、so_19957451 という名前のパッケージが現在の SSIS プロジェクトに追加されているはずです。

    パッケージ構成

    BIML を介して既に行われているため、構成の必要はありませんが、詳細なスクリーンショットがより良い回答になります。

    これが基本パッケージです

    これが私の変数です

    Foreach ループの構成は、MSDN の記事と、Traverse サブフォルダーの選択に関する私のメモに記載されています

    ループごとに生成された値を変数 Current に割り当てます

    フラット ファイル ソースには、変数 @User::CurrentFileName を確実に使用するために、ConnectionString プロパティに適用される式があります。これにより、ループの実行ごとにソースが変更されます。

    実行結果

    データベースからの結果

    パッケージ実行からの出力と一致




    1. PostgreSQLの機能はトランザクションですか?

    2. リダイレクト中にbashコマンドを実行する方法<<EOF

    3. 手動のwhereステートメントを使用した複数の更新条件を持つCodeigniterモデル

    4. INSERT INTO...SELECTすべての列を詳細化せずに