Ssis 将字符串值存储到对象中并在以后使用
我想将正在处理的文件名存储到变量中?然后稍后使用此变量(文件名)将这些文件移动到已处理的文件夹中。我正在使用foreach循环,其中数据流任务处理每个文件,并使用in循环将文件名存储到脚本任务中的对象中Ssis 将字符串值存储到对象中并在以后使用,ssis,etl,script-task,Ssis,Etl,Script Task,我想将正在处理的文件名存储到变量中?然后稍后使用此变量(文件名)将这些文件移动到已处理的文件夹中。我正在使用foreach循环,其中数据流任务处理每个文件,并使用in循环将文件名存储到脚本任务中的对象中 string filename = Dts.Variables["User::FILE_NAME"].Value.ToString(); object proccessed_file_name; proccessed_file_name += filename; Dts.Variables["U
string filename = Dts.Variables["User::FILE_NAME"].Value.ToString();
object proccessed_file_name;
proccessed_file_name += filename;
Dts.Variables["User::FILE_NAME"].Value = proccessed_file_name;
请帮助我将字符串值存储到对象中,稍后在包中使用 无需脚本任务,只需1个变量
User::FILE\u NAME
在目录上使用foreach循环
,从该任务填充文件名
。通过数据流转换处理文件。然后移动文件。然后让您的foreach循环继续。通过以增量方式移动文件,您将准确地知道哪些成功,哪些失败,并且能够重新启动流程,而无需回滚正确处理的文件并从头开始
如果你想等着移动所有东西,你可以做两步移动。1使用与上述相同的逻辑,只需将原始目录重命名为.processed或其他内容。然后,在该循环完成后,将另一个foreach
过滤添加到已处理的文件中,然后使用相同的FILE\u NAME
变量并移动文件
在这两种情况下都不需要脚本任务
如果确实要使用脚本任务
。将脚本任务
放在DFT
之后的foreach循环中
。另一个变量是对象
类型,它将保存数据表
或其他内容。用文件名等填充该DataTable
。然后在foreach
之后,您将需要另一个脚本任务
,该任务将加载该表并获取要处理的文件名。老实说,在最后一步中,最容易使用system.io
并在脚本中移动文件
您将如何使用datatable
之类的变量(我是自由编写的,因此可能需要额外的步骤和错误检查。)
要将文件名填充到DataTable
,请使File\u Name
变量可读,并使DataTableVariableName
可读/写到脚本任务中,然后从以下内容开始:
实际上,您可能需要测试user变量的null值。在这一行之前,value
值不是正值
system.data.datatable dt = (system.data.datatable)Dts.Variables["User::DataTableVariableName"].Value;
if (dt == null)
{
Write code to create your datatable
}
Add new DataRow to table -- lots of results on web about this and creating datatable.
现在您有了数据表
。在foreach循环之后
添加脚本任务
以移动处理过的文件
再次从从从变量检索表开始
system.data.datatable dt = (system.data.datatable)Dts.Variables["User::DataTableVariableName"].Value;
然后遍历datatable
,我建议也将文件移到这里
foreach (dt datarow in dt.rows)
{
typically I like to suggest copying and then deleting the source file depending on how you over write. so you would do something like.
If (system.io.file.Exists(dr.["FileNameRowLable"].ToString())
{
system.io.file.copy(source, destination);
if (file.exists(destination))
{
file.delete(source);
}
}
}
我想你会更乐意坚持在f或每个循环中移动文件,这样你就不需要脚本任务了。你可以不用脚本任务,只需要一个变量User::file\u NAME
在目录上使用foreach循环
,从该任务填充文件名
。通过数据流转换处理文件。然后移动文件。然后让您的foreach循环继续。通过以增量方式移动文件,您将准确地知道哪些成功,哪些失败,并且能够重新启动流程,而无需回滚正确处理的文件并从头开始
如果你想等着移动所有东西,你可以做两步移动。1使用与上述相同的逻辑,只需将原始目录重命名为.processed或其他内容。然后,在该循环完成后,将另一个foreach
过滤添加到已处理的文件中,然后使用相同的FILE\u NAME
变量并移动文件
在这两种情况下都不需要脚本任务
如果确实要使用脚本任务
。将脚本任务
放在DFT
之后的foreach循环中
。另一个变量是对象
类型,它将保存数据表
或其他内容。用文件名等填充该DataTable
。然后在foreach
之后,您将需要另一个脚本任务
,该任务将加载该表并获取要处理的文件名。老实说,在最后一步中,最容易使用system.io
并在脚本中移动文件
您将如何使用datatable
之类的变量(我是自由编写的,因此可能需要额外的步骤和错误检查。)
要将文件名填充到DataTable
,请使File\u Name
变量可读,并使DataTableVariableName
可读/写到脚本任务中,然后从以下内容开始:
实际上,您可能需要测试user变量的null值。在这一行之前,value
值不是正值
system.data.datatable dt = (system.data.datatable)Dts.Variables["User::DataTableVariableName"].Value;
if (dt == null)
{
Write code to create your datatable
}
Add new DataRow to table -- lots of results on web about this and creating datatable.
现在您有了数据表
。在foreach循环之后
添加脚本任务
以移动处理过的文件
再次从从从变量检索表开始
system.data.datatable dt = (system.data.datatable)Dts.Variables["User::DataTableVariableName"].Value;
然后遍历datatable
,我建议也将文件移到这里
foreach (dt datarow in dt.rows)
{
typically I like to suggest copying and then deleting the source file depending on how you over write. so you would do something like.
If (system.io.file.Exists(dr.["FileNameRowLable"].ToString())
{
system.io.file.copy(source, destination);
if (file.exists(destination))
{
file.delete(source);
}
}
}
我想你会更乐意坚持在f或每个循环中移动文件,这样你就不需要脚本任务了