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 通过ForEach循环容器处理不匹配的文件_Ssis_Foreach Loop Container - Fatal编程技术网

Ssis 通过ForEach循环容器处理不匹配的文件

Ssis 通过ForEach循环容器处理不匹配的文件,ssis,foreach-loop-container,Ssis,Foreach Loop Container,我的源文件夹和文件名中有一些已处理和未处理的文件 所有处理过的文件中的一个存储在表中。如何在ForEach循环容器之前匹配源文件夹和表的文件名,并仅处理不匹配的文件 下面的解决方案有点复杂,但这是我能想到的最好的解决方案 步骤1:创建两个变量,都是字符串 a)CurrentFile: This will be used for your Foreach Loop Container collection value b)ToProcess: This will be us

我的源文件夹和文件名中有一些已处理和未处理的文件
所有处理过的文件中的一个存储在表中。如何在ForEach循环容器之前匹配源文件夹和表的文件名,并仅处理不匹配的文件

下面的解决方案有点复杂,但这是我能想到的最好的解决方案

步骤1:创建两个变量,都是字符串

      a)CurrentFile: This will be used for your Foreach Loop Container collection value
      b)ToProcess: This will be used to map the result set an Execute SQL Task explained 
                 below
步骤2:将执行SQL任务添加到Foreach循环容器中

配置参数映射,如下所示:

使用以下脚本作为SQL语句:

DECLARE @ToProcess VARCHAR(1)

IF NOT EXISTS(SELECT [FileNames] FROM [YourFilesTable] WHERE FileNames = ?)

SET @ToProcess = 'Y'

SELECT @ToProcess AS ToProcess
将ResultSet设置为单行,如下所示:

按如下所示配置结果集:

在执行SQL任务上,配置优先约束,如下所示:

您的Foreach循环容器应如下所示:


在Foreach循环之前,使用脚本任务将未处理文件的名称存储在SSIS对象变量中,然后遍历该变量以加载新文件。创建一个对象变量,并将其添加到脚本任务的ReadWriteVariables字段中。如果使用SSIS变量保存源文件的文件夹路径(如下所示),请将其添加到ReadOnlyVariables字段中。Foreach循环需要使用Foreach From变量枚举器枚举器类型。在集合页面的变量字段中,添加在脚本任务中填充的对象变量。正如您可能已经在做的那样,在变量映射窗格的索引0处添加一个字符串变量,并将此变量设置为连接管理器上ConnectionString属性的表达式,假设这是一个平面文件连接。如果这是excel,请更改ExcelFilePath属性以使用此变量作为表达式。下面是脚本任务的示例代码和引用的名称空间,它们使用C

using System.Linq;
using System.Data.SqlClient;
using System.IO;
using System.Collections.Generic;
using System.Data;

string connString = @"Data Source=YourSQLServer;Initial Catalog=YourDatabase;Integrated Security=SSPI;";
string cmdText = @"SELECT DISTINCT ColumnWithFileNames FROM YourDatabase.YourSchema.YourTable";

string sourceFolder = Dts.Variables["User::SourceFilePath"].Value.ToString();

//create DirectoryInfo object from source folder
DirectoryInfo di = new DirectoryInfo(sourceFolder);
List<string> processedFiles = new List<string>();

List<string> newFiles = new List<string>();


//get names of already processed files stored in tavle
using (SqlConnection conn = new SqlConnection(connString))
{
    conn.Open();
    //data set name does not need to relate to name of table storing processed files
    DataSet ds = new DataSet("ProcessedFiles");
    SqlDataAdapter da = new SqlDataAdapter(cmdText, conn);
    da.Fill(ds, "ProcessedFiles");

    foreach (DataRow dr in ds.Tables["ProcessedFiles"].Rows)
    {
        processedFiles.Add(dr[0].ToString());
    }

}

foreach (FileInfo fi in di.EnumerateFiles())
{
    //only add files not already processed
    if (!processedFiles.Contains(fi.FullName))
    {
        newFiles.Add(fi.FullName);
    }
}

//populate SSIS object variable with unprocessed files
Dts.Variables["User::ObjVar"].Value = newFiles.ToList();