복붙노트

[SQL] 어떻게 데이터베이스에 같은 이름과 스키마하지만 다른 디렉토리에 텍스트 파일을 가져?

SQL

어떻게 데이터베이스에 같은 이름과 스키마하지만 다른 디렉토리에 텍스트 파일을 가져?

나는 SQL 서버 2008 데이터베이스에서 같은 테이블에 같은 이름을 가진 여러 TXT 파일과 같은 스키마를 가져올 필요합니다. 내가 가지고 문제는 그들이 모든 다른 디렉토리에 있다는 것입니다 :

TEST
     201304
            sample1.txt
            sample2.txt
     201305
            sample1.txt
            sample2.txt
     201306
            sample1.txt
            sample2.txt

나는이를 설정할 수 있습니다 SSIS의 방법이 있습니까?

해결법

  1. ==============================

    1.예. 당신은 foreach는 파일 컨테이너를 사용하고 트래버스 하위 폴더 옵션을 선택하는 것이 좋습니다.

    예. 당신은 foreach는 파일 컨테이너를 사용하고 트래버스 하위 폴더 옵션을 선택하는 것이 좋습니다.

    분명히 내 대답은 cromulent 충분하지, 그래서 내 간단한 원래의 대답은 명시된 것을 보여이 작업 코드를 받아주십시오.

    sample1.txt 파일과 sample2.txt를 포함하도록 상기 한 바와 같이 나는 3 개 폴더를 생성

    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 파일을 클릭하고 SSIS 패키지 생성을 선택. 이 시점에서, 당신은 패키지 이름 so_19957451 현재 SSIS 프로젝트에 추가해야한다.

    이미 BIML을 통해 수행하지만 moar 스크린 샷 더 나은 답을하게되어 있기 때문에 모든 구성을위한 필요가 없습니다.

    이 기본 패키지입니다

    여기 내 변수는

    Foreach 루프의 구성은, 같은 MSDN 문서뿐만 아니라, 내 주 트래버스 하위 폴더를 선택에 불러

    가변 전류에 루프 당 생성 된 값을 할당

    플랫 파일 소스는 변수 @User :: CurrentFileName를 사용 보장하기 ConnectionString 속성에 적용되는식이있다. 이 루프의 실행에 따라 소스를 변경합니다.

    데이터베이스에서 결과

    패키지 실행의 출력을 일치

  2. from https://stackoverflow.com/questions/19957451/how-to-import-text-files-with-the-same-name-and-schema-but-different-directories by cc-by-sa and MIT license