我需要将具有相同名称和相同架构的多个txt文件导入到Server 2008数据库中的同一个表中。我遇到的问题是,它们都在不同的目录中:
TEST
201304
sample1.txt
sample2.txt
201305
sample1.txt
sample2.txt
201306
sample1.txt
sample2.txt在SSIS中有什么方法可以让我设置这个吗?
发布于 2013-11-13 15:28:14
是。您将需要使用一个Foreach文件容器,然后检查TraVerse子文件夹选项。
编辑
很明显,我的回答不够实际,所以请接受这个工作代码,它说明了我最初的简短答案。
源数据
如上文所述,我创建了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封装生成
此部分假设您已经安装了投标帮手。它并不是解决方案所必需的,而只是提供了一个公共框架,将来读者可以使用它来复制这个解决方案。
我创建了一个具有以下内容的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完成了,但是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”的处理已经结束。
https://stackoverflow.com/questions/19957451
复制相似问题