我有一个SSIS导入模块,它循环遍历文件夹中的文件,并为每个文件循环遍历其中的工作表.在这些文件中,我只想要具有相同命名约定的特定工作表上的数据2006 - claims report,2007 - claims report依此类推.
无论如何,我只能导入具有该命名约定的工作表并跳过所有其他工作表?
这是使用变量值上的正则表达式在Foreach容器中的一些脚本吗?还是需要一个与Foreach容器一起使用的表达式?
小智 6
是的,一种可能的选择是使用脚本任务来仅处理您偏好的工作表.
以下示例是使用SSIS 2008 R2和Excel 2010创建的.此示例的工作文件夹是C:\Temp\.我认为逻辑应该仍然适用于以前的版本.
在文件夹路径C:\Temp\,创建一个名为一个Excel 2007电子表格文件Country_States.xlsx有三个工作,即US_1,US_2和Canada_1.
US_1的Country_States.xlsx含有下列数据

US_2的Country_States.xlsx含有下列数据

Canada_1的Country_States.xlsx含有下列数据

使用以下创建脚本在SQL Server中创建名为dbo.Destination的表.Excel工作表数据将插入此表中.
CREATE TABLE [dbo].[Destination](
[Id] [int] IDENTITY(1,1) NOT NULL,
[State] [nvarchar](255) NULL,
[Country] [nvarchar](255) NULL,
[FilePath] [nvarchar](255) NULL,
[SheetName] [nvarchar](255) NULL,
CONSTRAINT [PK_Destination] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)
该表目前是空的.

创建一个新的SSIS包,并在包上创建以下6个变量.FolderPath将包含存储Excel文件的文件夹.FilePattern将包含将循环的文件的扩展名,此示例仅适用于.xlsx.FilePath将由Foreach循环容器赋值,但我们需要一个有效的路径来开始设计时间,并且当前填充C:\temp\Country_States.xlsx了第一个Excel文件的路径.SheetName将包含实际的工作表名称,但我们需要填充初始值US_1$以避免设计时错误.ProcessTheSheet将包含true/false并使用默认值false设置.PatternToMatch将包含将用于仅匹配我们选择的工作表的模式.

在包的连接管理器中,使用以下配置创建ADO.NET连接,并将其命名为ExcelSchema.
选择Microsoft Office 12.0 Access Database Engine OLE DB Provider.Net Providers for OleDb下的提供商.提供文件路径C:\temp\Country_States.xlsx

单击All左侧的部分,将属性扩展属性设置为Excel 12.0以表示Excel的版本.在这种情况下,12.0表示Excel 2007 or above.单击"测试连接"以确保连接成功.

创建名为Excel的Excel连接管理器,如下所示.

创建名为的OLE DB连接SQL Server SQLServer.因此,我们应该在包上有三个连接,如下所示.

我们需要进行以下连接字符串更改,以便在文件循环时动态更改Excel文件.
在连接ExcelSchema上,配置表达式ServerName以使用该变量FilePath.单击省略号按钮以配置表达式.

类似地,在连接Excel上,配置表达式ServerName以使用该变量FilePath.单击省略号按钮以配置表达式.

在控制流程中,将两个Foreach循环容器放在另一个容器中.第一个Foreach Loop container名为Loop的文件将遍历文件.第二个Foreach Loop container将通过容器内的纸张.在内部对于每个循环容器,放置一个脚本任务,它将仅验证应处理的工作表和一个将读取Excel文件并将数据加载到SQL的数据流任务

配置名为Loop文件的第一个Foreach循环容器,如下所示:


配置名为Loop sheet的第一个Foreach循环容器,如下所示:


应使用以下代码配置脚本任务,SheetName以根据存储在PatternToMatch变量中的模式验证值.如果SheetName与模式匹配,则变量ProcessTheSheet设置为True,否则将设置为False.
SSIS 2008及以上版本的C#代码
包括using System.Text.RegularExpressions;RegEx 的声明.
public void Main()
{
Variables varCollection = null;
Dts.VariableDispenser.LockForRead("User::SheetName");
Dts.VariableDispenser.LockForRead("User::PatternToMatch");
Dts.VariableDispenser.LockForWrite("User::ProcessTheSheet");
Dts.VariableDispenser.GetVariables(ref varCollection);
string sheetName = varCollection["User::SheetName"].Value.ToString();
string pattern = varCollection["User::PatternToMatch"].Value.ToString();
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
Match match = Regex.Match(sheetName, pattern);
varCollection["User::ProcessTheSheet"].Value = match.Success;
Dts.TaskResult = (int)ScriptResults.Success;
}
Run Code Online (Sandbox Code Playgroud)
右键连接脚本任务和数据流任务的连接器,然后选择编辑选项.它应该带有Precedence Constraint Editor对话框.将"评估"操作设置为"表达式"并将"表达式"设置为" @[User::ProcessTheSheet]此表达式"将允许程序包仅在Sheetname与变量PatternToMatch中提供的模式匹配时继续到"数据流任务".您可以注意到连接器包含fx,这意味着有一个表达式,颜色也从绿色变为蓝色.

在数据流任务中,放置Excel源,派生列和OLE DB目标,如下所示:

配置Excel源以读取相应的Excel文件和当前正在循环的工作表.


配置派生列以为文件名和工作表名称创建新列.这只是为了演示这个例子,但没有意义.

配置OLE DB目标以将数据插入SQL表.


下面的屏幕截图显示了包的成功执行.

当PatternToMatch变量设置为值CA*时,仅使用Sheet Canada_1中的值填充表.

删除了表中的所有行.将PatternToMatch变量值更改为US*,表格仅使用工作表US_1和US_2中的值填充.

希望有所帮助.
| 归档时间: |
|
| 查看次数: |
3562 次 |
| 最近记录: |