File 如何仅在没有';使用SSIS包的目标中是否不存在?
我在网络上有一个包含文件的文件夹,我正在将文件从一个文件夹移动到另一个文件夹。但是我只想移动新文件,所以只复制目标文件夹中不存在的文件。怎么用?我已经为每个循环容器和一个文件系统任务准备了File 如何仅在没有';使用SSIS包的目标中是否不存在?,file,sql-server-2008,ssis,flat,File,Sql Server 2008,Ssis,Flat,我在网络上有一个包含文件的文件夹,我正在将文件从一个文件夹移动到另一个文件夹。但是我只想移动新文件,所以只复制目标文件夹中不存在的文件。怎么用?我已经为每个循环容器和一个文件系统任务准备了。我在使用变量。现在,每次执行包时,它都会将所有文件从一个文件夹复制到下一个文件夹。有什么条件工具可以让我坚持下去吗?我不太擅长编写脚本,因此如果这是唯一的解决方案,我可能需要您的帮助。这里有一个潜在的解决方案,有两个假设: 目标文件夹中的所有文件 我们被这个包裹感动了 文件名是唯一的 您可以将文件名日志记录步
。我在使用变量。现在,每次执行包时,它都会将所有文件从一个文件夹复制到下一个文件夹。有什么条件工具可以让我坚持下去吗?我不太擅长编写脚本,因此如果这是唯一的解决方案,我可能需要您的帮助。这里有一个潜在的解决方案,有两个假设:
目标文件夹中的所有文件
我们被这个包裹感动了
文件名是唯一的
您可以将文件名日志记录步骤添加到ETL
在数据库中创建一个新的日志表,其中包含一列文件名。在包的每个循环上,将文件名写入此表。然后,您可以将其用作一个简单的查找表,ETL中的某些条件逻辑使用该表来检查正在处理的文件名是否与现有文件匹配
具体如何实现日志记录步骤和条件检查(可能是数据流中的条件检查、脚本任务中完成的条件检查等)将取决于您的包的设计,但它应该完成您所寻找的内容。这里有一个可能的选项,您可以使用Foreach循环容器来实现这一点,脚本任务和文件系统任务。下面的示例显示了如何做到这一点。该示例是使用SSIS 2008 R2创建的
逐步过程:
在路径C:\temp\
中创建两个名为Source和Destination的文件夹,如屏幕截图1所示
public void Main()
{
Variables varCollection = null;
Dts.VariableDispenser.LockForRead("User::DestinationFilePath");
Dts.VariableDispenser.LockForWrite("User::DoesFileExist");
Dts.VariableDispenser.GetVariables(ref varCollection);
varCollection["User::DoesFileExist"].Value = Convert.ToBoolean(System.IO.File.Exists(varCollection["User::DestinationFilePath"].Value.ToString()));
Dts.TaskResult = (int)ScriptResults.Success;
}
在文件夹路径C:\temp\Source\
中放置一个名为sample\u file\u 01.txt的示例文件,并将另一个文件夹C:\temp\Destination\
留空。仅当文件不存在时,SSIS包才会将文件从源文件夹复制到目标文件夹。请参阅截图#2和#3
public void Main()
{
Variables varCollection = null;
Dts.VariableDispenser.LockForRead("User::DestinationFilePath");
Dts.VariableDispenser.LockForWrite("User::DoesFileExist");
Dts.VariableDispenser.GetVariables(ref varCollection);
varCollection["User::DoesFileExist"].Value = Convert.ToBoolean(System.IO.File.Exists(varCollection["User::DestinationFilePath"].Value.ToString()));
Dts.TaskResult = (int)ScriptResults.Success;
}
在SSIS包上,创建7个变量,如屏幕截图#4所示。将变量DestinationFolder设置为C:\temp\Destination\
的值。将变量SourceFolder设置为C:\temp\Source\
的值。将变量FilePattern设置为值*.
。您可以根据需要更改这些变量的值
选择变量SourceFilePath,然后按F4按钮打开Properties
窗口。将属性evaluatesExpression更改为True
,并将属性表达式设置为值@[User::SourceFolder]+@[User::FileName]
。请参阅屏幕截图#5
public void Main()
{
Variables varCollection = null;
Dts.VariableDispenser.LockForRead("User::DestinationFilePath");
Dts.VariableDispenser.LockForWrite("User::DoesFileExist");
Dts.VariableDispenser.GetVariables(ref varCollection);
varCollection["User::DoesFileExist"].Value = Convert.ToBoolean(System.IO.File.Exists(varCollection["User::DestinationFilePath"].Value.ToString()));
Dts.TaskResult = (int)ScriptResults.Success;
}
选择变量DestinationFilePath,然后按F4按钮打开Properties
窗口。将属性evaluatesExpression更改为True
,并将属性表达式设置为值@[User::DestinationFolder]+@[User::FileName]
。请参阅屏幕截图#6
public void Main()
{
Variables varCollection = null;
Dts.VariableDispenser.LockForRead("User::DestinationFilePath");
Dts.VariableDispenser.LockForWrite("User::DoesFileExist");
Dts.VariableDispenser.GetVariables(ref varCollection);
varCollection["User::DoesFileExist"].Value = Convert.ToBoolean(System.IO.File.Exists(varCollection["User::DestinationFilePath"].Value.ToString()));
Dts.TaskResult = (int)ScriptResults.Success;
}
在SSIS包的C控制流选项卡上,放置一个Foreach循环容器
,并配置容器的属性,如屏幕截图#7和#8所示。确保在收藏部分选择单选按钮名称和分机
在Foreach循环容器中,放置一个脚本任务
。双击脚本任务并单击编辑脚本按钮。用脚本任务代码部分给出的代码替换脚本任务内的Main()方法。此代码检查目标文件是否已存在,然后相应地填充布尔变量DoesFileExist
在Foreach循环容器中,将文件系统任务
放置在脚本任务下方。将脚本任务的成功绿色箭头连接到文件系统任务。如屏幕截图9所示配置文件系统任务
public void Main()
{
Variables varCollection = null;
Dts.VariableDispenser.LockForRead("User::DestinationFilePath");
Dts.VariableDispenser.LockForWrite("User::DoesFileExist");
Dts.VariableDispenser.GetVariables(ref varCollection);
varCollection["User::DoesFileExist"].Value = Convert.ToBoolean(System.IO.File.Exists(varCollection["User::DestinationFilePath"].Value.ToString()));
Dts.TaskResult = (int)ScriptResults.Success;
}
我们只需要在目标路径中不存在文件时执行文件系统任务。因此,我们需要更改脚本任务和文件系统任务之间的连接器。右键单击绿色连接器并选择编辑,如屏幕截图#10所示
public void Main()
{
Variables varCollection = null;
Dts.VariableDispenser.LockForRead("User::DestinationFilePath");
Dts.VariableDispenser.LockForWrite("User::DoesFileExist");
Dts.VariableDispenser.GetVariables(ref varCollection);
varCollection["User::DoesFileExist"].Value = Convert.ToBoolean(System.IO.File.Exists(varCollection["User::DestinationFilePath"].Value.ToString()));
Dts.TaskResult = (int)ScriptResults.Success;
}
配置优先约束,如屏幕截图#11所示。这将检查变量DoesFileExist是否包含值False
,这意味着在目标中找不到该文件
配置后,SSIS包应如屏幕截图#12所示
public void Main()
{
Variables varCollection = null;
Dts.VariableDispenser.LockForRead("User::DestinationFilePath");
Dts.VariableDispenser.LockForWrite("User::DoesFileExist");
Dts.VariableDispenser.GetVariables(ref varCollection);
varCollection["User::DoesFileExist"].Value = Convert.ToBoolean(System.IO.File.Exists(varCollection["User::DestinationFilePath"].Value.ToString()));
Dts.TaskResult = (int)ScriptResults.Success;
}
屏幕截图35;13显示了第一次执行的包。在此执行过程中,目标路径C:\temp\destination\
中没有文件。执行后,文件Sample\u file\u 01.txt已从C:\temp\Source\
复制到C:\temp\Destination\
。请参阅屏幕截图#14
public void Main()
{
Variables varCollection = null;
Dts.VariableDispenser.LockForRead("User::DestinationFilePath");
Dts.VariableDispenser.LockForWrite("User::DoesFileExist");
Dts.VariableDispenser.GetVariables(ref varCollection);
varCollection["User::DoesFileExist"].Value = Convert.ToBoolean(System.IO.File.Exists(varCollection["User::DestinationFilePath"].Value.ToString()));
Dts.TaskResult = (int)ScriptResults.Success;
}
屏幕截图35;15显示了第二次执行的包。在此执行过程中,未将任何文件复制到目标路径C:\temp\destination\
。您可以注意到,文件系统任务
没有执行,因为优先级约束失败
希望有帮助
脚本任务代码:
C#