首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将名称和架构相同但目录不同的文本文件导入数据库?

如何将名称和架构相同但目录不同的文本文件导入数据库?
EN

Stack Overflow用户
提问于 2013-11-13 15:17:17
回答 1查看 3K关注 0票数 8

我需要将具有相同名称和相同架构的多个txt文件导入到Server 2008数据库中的同一个表中。我遇到的问题是,它们都在不同的目录中:

代码语言:javascript
复制
TEST
     201304
            sample1.txt
            sample2.txt
     201305
            sample1.txt
            sample2.txt
     201306
            sample1.txt
            sample2.txt

在SSIS中有什么方法可以让我设置这个吗?

EN

回答 1

Stack Overflow用户

发布于 2013-11-13 15:28:14

是。您将需要使用一个Foreach文件容器,然后检查TraVerse子文件夹选项。

编辑

很明显,我的回答不够实际,所以请接受这个工作代码,它说明了我最初的简短答案。

源数据

如上文所述,我创建了3个文件夹,以包含文件sample1.txtsample2.txt

代码语言:javascript
复制
C:\>MKDIR SSISDATA\SO\TEST\201304
C:\>MKDIR SSISDATA\SO\TEST\201305
C:\>MKDIR SSISDATA\SO\TEST\201306

文件的内容如下。每个文件夹中的每个文件版本的ID值都会随着文本值的更改而增加,以证明它已经拾取了新文件。

代码语言:javascript
复制
ID,value
1,ABC

封装生成

此部分假设您已经安装了投标帮手。它并不是解决方案所必需的,而只是提供了一个公共框架,将来读者可以使用它来复制这个解决方案。

我创建了一个具有以下内容的BIML文件。尽管我有创建表的步骤,但在生成包之前,我需要在目标服务器上运行该步骤。

代码语言:javascript
复制
<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完成了,但是moar截图提供了更好的答案。

这是基本的包

这是我的变量

Foreach循环的配置,正如MSDN文章中所提到的,以及我关于选择Traverse子文件夹的说明

将每个循环生成的值赋值给可变电流。

平面文件源有一个应用于ConnectionString属性的表达式,以确保它使用变量@User::CurrentFileName。这将更改循环每次执行的源。

执行结果

数据库的结果

匹配包执行的输出。

信息: 0x402090DC在DFT导入文件,FFS示例2:文件“C:ssisdata\so\TEST\201304\sample1.txt”的处理已经启动。 信息: 0x402090DD在DFT导入文件,FFS示例2:文件“C:ssisdata\so\TEST\201304\sample1.txt”的处理已经结束。 信息: 0x402090DC在DFT导入文件,FFS示例2:文件“C:ssisdata\so\TEST\201304\sample2.txt”的处理已经启动。 信息: 0x402090DD在DFT导入文件,FFS示例2:文件“C:ssisdata\so\TEST\201304\sample2.txt”的处理已经结束。 信息: 0x402090DC在DFT导入文件,FFS示例2:文件“C:ssisdata\so\TEST\201305\sample1.txt”的处理已经启动。 信息: 0x402090DD在DFT导入文件,FFS示例2:文件“C:ssisdata\so\TEST\201305\sample1.txt”的处理已经结束。 信息: 0x402090DC在DFT导入文件,FFS示例2:文件“C:ssisdata\so\TEST\201305\sample2.txt”的处理已经启动。 信息: 0x402090DD在DFT导入文件,FFS示例2:文件“C:ssisdata\so\TEST\201305\sample2.txt”的处理已经结束。 信息: 0x402090DC在DFT导入文件,FFS示例2:文件“C:ssisdata\so\TEST\201306\sample1.txt”的处理已经启动。 信息: 0x402090DD在DFT导入文件,FFS示例2:文件“C:ssisdata\so\TEST\201306\sample1.txt”的处理已经结束。 信息: 0x402090DC在DFT导入文件,FFS示例2:文件“C:ssisdata\so\TEST\201306\sample2.txt”的处理已经启动。 信息: 0x402090DD在DFT导入文件,FFS示例2:文件“C:ssisdata\so\TEST\201306\sample2.txt”的处理已经结束。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19957451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档