Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSIS:从文件夹中获取任何平面文件源,并将名称缓存为超级全局变量_Ssis - Fatal编程技术网

SSIS:从文件夹中获取任何平面文件源,并将名称缓存为超级全局变量

SSIS:从文件夹中获取任何平面文件源,并将名称缓存为超级全局变量,ssis,Ssis,我在SSIS和VisualStudio2008工作。执行时,我需要让SSIS包执行以下任务: 检查文件夹中的文件 如果存在文件,则将该文件用作平面文件的源 将文件名存储到全局变量中,我可以在包的其他部分访问该变量 该包将由其他脚本运行。因此,我们需要它在每次包运行时检查文件。我们正试图防止出现这样的情况:当文件出现时,我们必须监视文件夹并手动执行包 有什么建议吗 这里有一个可能的选择。您可以使用Foreach循环容器来实现这一点。请查找我在下面提供的示例。希望这能提供一个想法 逐步过程: 在

我在SSIS和VisualStudio2008工作。执行时,我需要让SSIS包执行以下任务:

  • 检查文件夹中的文件
  • 如果存在文件,则将该文件用作平面文件的源
  • 将文件名存储到全局变量中,我可以在包的其他部分访问该变量
该包将由其他脚本运行。因此,我们需要它在每次包运行时检查文件。我们正试图防止出现这样的情况:当文件出现时,我们必须监视文件夹并手动执行包


有什么建议吗

这里有一个可能的选择。您可以使用
Foreach循环
容器来实现这一点。请查找我在下面提供的示例。希望这能提供一个想法

逐步过程:

  • 在SSIS包中,创建3个变量显示在屏幕截图#1中。范围
    CheckFile
    表示包名。变量
    Folder
    将表示要检查文件的文件夹<代码>文件名表示要检查的文件名。变量
    FilePath
    将是您需要的全局变量。如果文件存在,将用文件路径值填充,否则将为空

  • 在包的控制流选项卡上,放置一个
    Foreach循环容器
    和一个
    脚本任务
    。脚本任务是在Foreach循环容器执行完成后显示变量保留值。请参阅屏幕截图#2

  • 配置ForEach循环容器,如屏幕截图#3和#4所示

  • 将S
    Script任务中的Main()方法替换为
    Script任务代码
    部分给出的代码。这是为了演示变量
    FilePath
    保留的值

  • 屏幕截图#5显示路径
    c:\temp\
    中不存在文件,屏幕截图#6显示相应的包执行

  • 屏幕截图#7显示路径
    c:\temp\
    中存在的文件
    TestFile.txt
    ,屏幕截图#8显示相应的包执行

  • 如果要在文件存在时处理该文件,可以在
    Foreach循环容器中放置
    数据流任务

  • 希望有帮助

    脚本任务代码:

    C#只能在SSIS 2008及以上版本中使用的代码

    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