Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да импортирам текстови файлове със същото име и схема, но различни директории в база данни?

да Ще искате да използвате контейнер за всеки файл и след това проверете опцията Traverse Subfolder.

Редактиране

Очевидно отговорът ми не беше достатъчно хромулентен, така че, моля, приемете този работен код, който илюстрира какво гласеше моят кратък оригинален отговор.

Изходни данни

Създадох 3 папки, както е описано по-горе, за да съдържат файлове sample1.txt и 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 инсталиран. Не е необходимо за решението, а просто предоставя обща рамка, която бъдещите читатели могат да използват, за да възпроизведат това решение

Създадох 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, но екранните снимки на moor дават по-добри отговори.

Това е основният пакет

Ето моите променливи

Конфигуриране на цикъла Foreach, както е посочено в статията на MSDN, както и в моята бележка за избор на подпапка Traverse

Присвоете стойността, генерирана за цикъл, на променливата Current

Източникът на плосък файл има израз, приложен към свойството ConnectionString, за да се гарантира, че използва променливата @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. Как да свържа Cakephp 1.3 с MS SQLServer 2008?

  2. Ограничаване на едновременни потребителски сесии за специфично влизане в SQL Server

  3. Как мога да реша проблем с пула за връзки между ASP.NET и SQL Server?

  4. Как мога да разбера кога попълването на пълен текстов индекс на SQL приключи?

  5. Каква е ефективността на клаузата Merge в sql server 2008?