Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana cara mengimpor file teks dengan nama dan skema yang sama tetapi direktori berbeda ke dalam basis data?

Ya. Anda akan ingin menggunakan Foreach File Container lalu centang opsi Traverse Subfolder.

Sunting

Rupanya jawaban saya tidak cukup cromulent, jadi terimalah kode kerja ini yang menggambarkan apa yang dinyatakan oleh jawaban asli singkat saya.

Data sumber

Saya membuat 3 folder seperti dijelaskan di atas untuk berisi file sample1.txt dan sample2.txt

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

Isi filenya ada di bawah. Setiap versi file di setiap folder memiliki nilai ID yang bertambah bersama dengan nilai teks yang diubah untuk membuktikan bahwa file tersebut telah mengambil file baru.

ID,value
1,ABC

Pembuatan paket

Bagian ini mengasumsikan Anda memiliki BIDS Helper diinstal. Ini tidak diperlukan untuk solusi tetapi hanya menyediakan kerangka kerja umum yang dapat digunakan pembaca di masa mendatang untuk mereproduksi solusi ini

Saya membuat file BIML dengan konten berikut. Meskipun saya memiliki langkah membuat tabel di sana, saya harus menjalankannya di server target sebelum membuat paket.

<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>

Klik kanan pada file biml dan pilih Generate SSIS Package . Pada titik ini, Anda harus memiliki paket bernama so_19957451 yang ditambahkan ke proyek SSIS Anda saat ini.

Konfigurasi paket

Tidak perlu konfigurasi apa pun karena sudah dilakukan melalui BIML tetapi tangkapan layar moar memberikan jawaban yang lebih baik.

Ini adalah paket dasar

Ini variabel saya

Konfigurasi Foreach Loop, seperti yang disebutkan dalam artikel MSDN serta catatan saya untuk memilih subfolder Traverse

Tetapkan nilai yang dihasilkan per loop ke variabel Current

Sumber file datar memiliki ekspresi yang diterapkan ke properti ConnectionString untuk memastikannya menggunakan Variabel @User::CurrentFileName. Ini mengubah sumber per eksekusi loop.

Hasil eksekusi

Hasil dari database

Cocokkan output dari eksekusi paket




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Entity Framework 6 GUID sebagai kunci utama:Tidak dapat memasukkan nilai NULL ke kolom 'Id', kolom tabel 'FileStore' tidak mengizinkan nol

  2. Kembalikan Nomor Partisi untuk Setiap Baris Saat Membuat Kueri Tabel yang Dipartisi di SQL Server (T-SQL)

  3. sql server 2008 tabel nilai parameter linq2sql

  4. Cara Drop Database dengan menggunakan TSQL dan GUI - Tutorial SQL Server / TSQL Bagian 25

  5. Melewati DataTable ke prosedur tersimpan sebagai argumen