【问题标题】:How to pick dynamic files from a specific folder and then export to SQL server using SSIS如何从特定文件夹中选择动态文件,然后使用 SSIS 导出到 SQL Server
【发布时间】:2018-12-01 09:10:28
【问题描述】:

我一直在尝试创建一个从特定文件夹中选择 MS Access 文件的 SSIS 任务 然后导出到 SQL Server(如果在服务器中找到该文件/表,则跳过其他导出)。

我是 SSIS 新手,我使用脚本任务动态选择文件名,然后尝试移动,但最终得到不满意的结果。即使我用谷歌搜索并得到了一些想法,但仍然无法按照我想要的方式得到它。任何详细的帮助都会非常有帮助。

注意:在这里,我并不总是确定该文件夹中的文件名(即动态)

【问题讨论】:

  • “但我最终得到了不满意的结果”。你得到了什么结果,为什么他们不满意?
  • 出现错误,我不明白从特定文件夹中以动态方式选择文件的概念
  • 您遇到了什么错误以及您尝试了什么?
  • 文件在我编写脚本时未找到,已引用此 [链接]:sirhttps://social.msdn.microsoft.com/Forums/sqlserver/en-US/bb42c461-1f63-4283- 8a99-1d3b90cde53d/how-to-pick-up-latest-file-in-a-folder-using-ssis-package?forum=sqlintegrationservices

标签: sql-server ssis ms-access-2010 ssis-2012 ssis-2008


【解决方案1】:

有许多用于动态选择文件的选项。由于您不确定文件名,我假设这是一个参数或变量。以下是从变量中检查给定文件名的文件夹并将其加载到 SSIS object 变量的示例。然后使用Foreach Loop 将这些文件加载​​到 SQL Server 表中。您提到了文件而不是单个文件,因此此示例假定仅传入部分文件名,例如将日期/UID 附加到文件名的开头或结尾的情况。

  • 添加一个脚本任务,参数/变量将文件和文件夹名称保存为ReadOnlyVariables,将在执行期间将文件名存储为ReadWriteVariable的对象变量。代码在这篇文章的末尾。 string.IndexOf 方法用于检查包含给定文本的文件,StringComparison.CurrentCultureIgnoreCase 参数用于使此搜索不区分大小写。此示例使用一个变量作为文件路径,使用一个参数作为文件名(在参数名中用$Package 表示)。
  • 添加Foreach From Variable Enumerator 枚举器类型的Foreach Loop。将脚本任务中填充的对象变量添加为集合页面上的变量。在“变量映射”窗格中,在索引 0 处添加一个字符串变量。这需要是一个空字符串变量,用于保存每个文件的名称。
  • 从示例数据文件创建平面文件连接管理器。确保正确配置了列名和数据类型。要动态设置文件名,请选择ConnectionString 表达式(单击连接管理器“属性”窗口中“表达式”属性的省略号)并从Foreach Loop 的“映射”窗格中添加相同的字符串变量。
  • Foreach Loop 中,使用相同的连接管理器添加带有平面文件源的数据流任务。然后使用您的目标连接添加 OLE DB 或 SQL Server 目标,并将平面文件源连接到此。我发现 SQL Server 目标性能更好,但您需要在自己的环境中验证这一点,然后再做出选择。选择必要的表并相应地映射平面文件源中的列。

    List<string> fileList = new List<string>();
    
    //get files from input directory
    DirectoryInfo di = new DirectoryInfo(Dts.Variables["User::FilePathVariable"].Value.ToString());
    
    foreach (FileInfo f in di.GetFiles())
    {
        //check for files with name containing text
        if (f.Name.IndexOf(Dts.Variables["$Package::FileNameParameter"].Value.ToString(), 0, StringComparison.CurrentCultureIgnoreCase) >= 0)
        {
            fileList.Add(f.FullName);
        }
    }
    
    //populate object variable
    Dts.Variables["User::YourObjectVariable"].Value = fileList;
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多