SSIS:从文件夹中获取任何平面文件源,并将名称缓存为超级全局变量
我在SSIS和VisualStudio2008工作。执行时,我需要让SSIS包执行以下任务:SSIS:从文件夹中获取任何平面文件源,并将名称缓存为超级全局变量,ssis,Ssis,我在SSIS和VisualStudio2008工作。执行时,我需要让SSIS包执行以下任务: 检查文件夹中的文件 如果存在文件,则将该文件用作平面文件的源 将文件名存储到全局变量中,我可以在包的其他部分访问该变量 该包将由其他脚本运行。因此,我们需要它在每次包运行时检查文件。我们正试图防止出现这样的情况:当文件出现时,我们必须监视文件夹并手动执行包 有什么建议吗 这里有一个可能的选择。您可以使用Foreach循环容器来实现这一点。请查找我在下面提供的示例。希望这能提供一个想法 逐步过程: 在
- 检查文件夹中的文件
- 如果存在文件,则将该文件用作平面文件的源
- 将文件名存储到全局变量中,我可以在包的其他部分访问该变量
有什么建议吗 这里有一个可能的选择。您可以使用
Foreach循环
容器来实现这一点。请查找我在下面提供的示例。希望这能提供一个想法
逐步过程:
CheckFile
表示包名。变量Folder
将表示要检查文件的文件夹<代码>文件名表示要检查的文件名。变量FilePath
将是您需要的全局变量。如果文件存在,将用文件路径值填充,否则将为空Foreach循环容器
和一个脚本任务
。脚本任务是在Foreach循环容器执行完成后显示变量保留值。请参阅屏幕截图#2Script任务中的Main()方法替换为Script任务代码
部分给出的代码。这是为了演示变量FilePath
保留的值
c:\temp\
中不存在文件,屏幕截图#6显示相应的包执行c:\temp\
中存在的文件TestFile.txt
,屏幕截图#8显示相应的包执行Foreach循环容器中放置数据流任务
public void Main()
{
Variables varCollection = null;
Dts.VariableDispenser.LockForRead("User::FilePath");
Dts.VariableDispenser.GetVariables(ref varCollection);
if (String.IsNullOrEmpty(varCollection["User::FilePath"].Value.ToString()))
{
MessageBox.Show("File doesn't exist.");
}
else
{
MessageBox.Show("File " + varCollection["User::FilePath"].Value.ToString() + " exists.");
}
Dts.TaskResult = (int)ScriptResults.Success;
}
屏幕截图#1:
截图#2:
屏幕截图#3:
屏幕截图#4:
屏幕截图#5:
屏幕截图#6:
截图#7:
截图#8:
最简单的方法是设置一个Foreach循环容器,其中包含包的所有“工作”(可选地,您可以将其作为前置步骤,并在其中使用条件表达式)。假设您有两个名为FileName的变量(您将为其分配值)和一个包含我们应该查找的“where”的InputFolder变量
ForEach Loop Editor
Collection tab:
Enumerator = Foreach File Enumerators
Expression: Directory = @[User:InputFolder]
FileSpec: "YD.*"
Retrieve file name
* Fully qualified
Variable Mappings tab:
Variable: User::FileName
Index: 0
你也可以通过脚本任务来完成,如果你想看的话,请告诉我
编辑
此脚本再次假定已定义变量InputFolder和文件名。创建脚本任务组件,并将InputFolder作为只读变量选中,将FileName作为读/写变量选中
using System;
using System.Data;
using System.IO; // this needs to be added
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
// namespace will vary
namespace ST_bc177fa7cb7d4faca15531cb700b7f11.csproj
{
[System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
#region VSTA generated code
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
public void Main()
{
string inputFolder;
string fileName;
inputFolder = Dts.Variables["InputFolder"].Value.ToString();
// File, if exists will look like YD.CCYYMMDD.hhmmss.done
string fileMask = "YD.*.done";
// this array will catch all the files matching a given pattern
string[] foundFiles = null;
foundFiles = System.IO.Directory.GetFiles(inputFolder, fileMask);
// Since there should be only one file, we will grab the zeroeth
// element, should it exist
if (foundFiles.Length > 0)
{
fileName = foundFiles[0];
// write the value to our global SSIS variable
Dts.Variables["FileName"].Value = fileName;
}
Dts.TaskResult = (int)ScriptResults.Success;
}
}
}
它能找到多个与模式匹配的文件(MyFile_01、MyFile_02、MyFile_NN)吗?还是它总是一个固定的名称?通常是:YD.ccyymdd.hhmmss.done,但该文件夹中只有一个文件。答案彻底,速度比我的更快/欢迎对文件名中定义的特定文件进行此检查,或者检查文件夹中的任何文件?然后在连接管理器下的平面文件源中,我只引用C#中添加的@[User::FileName]correct?脚本任务。如果需要,可以轻松地移植到VB.NET/vsta