SSIS表达式生成器

SSIS表达式生成器,ssis,package,expression,builder,Ssis,Package,Expression,Builder,我有一个名为xyz_20170510_040544_det.txt的文件。 在带有get date的表达式中,日期戳更容易实现。这个 时间戳的问题是文件名中的时间每天都保持不变 改变。那么,在这种情况下,我该如何编写表达式呢 下面是ssis expression builder中要创建的包的表达式 获取我正在使用的文件 @[User::DataLoadDir]+"xyz_"+ (DT_STR,4,1252)DATEPART( "yyyy" , getdate() ) + RIGHT("0"

我有一个名为xyz_20170510_040544_det.txt的文件。 在带有get date的表达式中,日期戳更容易实现。这个 时间戳的问题是文件名中的时间每天都保持不变 改变。那么,在这种情况下,我该如何编写表达式呢

下面是ssis expression builder中要创建的包的表达式 获取我正在使用的文件

 @[User::DataLoadDir]+"xyz_"+ (DT_STR,4,1252)DATEPART( "yyyy" , 
 getdate() ) + RIGHT("0" + (DT_STR,4,1252)DATEPART( "mm" , getdate() ), 
 2) + RIGHT("0" + (DT_STR,4,1252)DATEPART( "dd" , getdate() ), 2) +.txt"

现在无法找到该文件,因为时间戳未包含在内。由于时间戳每天都不一样,我如何将其包含在这里。

我应用以下内容,生成“yyyymmdd_hhmmss”(20170510_132402;)格式,您可以将其与DataLoadDir变量和“.txt”连接起来

(DT_STR,41252)DATEPART(“yyyy”,GETDATE()) +右(“0”+(DT_STR,21252)日期部分(“mm”,GETDATE()),2) +右键(“0”+(DT_STR,21252)DATEPART(“dd”,GETDATE()),2)+“2” +右(“0”+(DT_STR,21252)日期部分(“hh”,GETDATE()),2) +右(“0”+(DT_STR,21252)日期部分(“mi”,GETDATE()),2) +右(“0”+(DT_STR,21252)日期部分(“ss”,GETDATE()),2)

因为有多个文件是用这种格式生成的,所以我实际上在表达式中将其分配给一个变量,然后在连接管理器中为每个新文件连接该变量。如果您也这样做,我建议使用相同的方法使包更加模块化并避免冗余。在一个变量中进行更改,它会自动应用于所有使用它的地方

但是,由于您实际上是在尝试从已经包含时间戳的目录中捕获文件,并且您只希望将文件名的第一部分用作通配符,而不包括时间戳,因此我建议您执行以下操作:

  • 将以下表达式应用于变量。这将只返回文件名的“xyz_20170510”部分

    @[User::DataLoadDir]+“xyz_”+(DT_STR,41252)日期部分(“yyy”, getdate())+右(“0”+(DT_STR,41252)日期部分(“mm”,getdate()), 2) +右(“0”+(DT_STR,41252)日期部分(“dd”,getdate()),2)

  • 将新变量作为ready仅传递给脚本任务(下面使用的是C#),该任务将对文件执行您想要的操作。以下代码是根据从中收集的代码修改的。如果C#不可取,也可以使用在包含系统任务的文件名上枚举的ForEach循环来执行相同的操作

字符串FileWildCard=Dts.Variables[“User::FileWildCard”].Value.ToString(); 字符串[]files=System.IO.Directory.GetFiles(@“\dev01\E$\Data\Proc\Opt”、@FileWildCard+“*.txt”); foreach(文件中的字符串文件) { System.IO.File.Copy(文件@“\dev01\E$\Data\Proc\Opt test\”+System.IO.Path.GetFileName(文件),true); }


请让我知道这是否有帮助。

我应用了以下生成“yyyymmdd_hhmmss”(20170510_132402)格式,您可以将其与DataLoadDir变量和“.txt”连接起来

(DT_STR,41252)DATEPART(“yyyy”,GETDATE()) +右(“0”+(DT_STR,21252)日期部分(“mm”,GETDATE()),2) +右键(“0”+(DT_STR,21252)DATEPART(“dd”,GETDATE()),2)+“2” +右(“0”+(DT_STR,21252)日期部分(“hh”,GETDATE()),2) +右(“0”+(DT_STR,21252)日期部分(“mi”,GETDATE()),2) +右(“0”+(DT_STR,21252)日期部分(“ss”,GETDATE()),2)

因为有多个文件是用这种格式生成的,所以我实际上在表达式中将其分配给一个变量,然后在连接管理器中为每个新文件连接该变量。如果您也这样做,我建议使用相同的方法使包更加模块化并避免冗余。在一个变量中进行更改,它会自动应用于所有使用它的地方

但是,由于您实际上是在尝试从已经包含时间戳的目录中捕获文件,并且您只希望将文件名的第一部分用作通配符,而不包括时间戳,因此我建议您执行以下操作:

  • 将以下表达式应用于变量。这将只返回文件名的“xyz_20170510”部分

    @[User::DataLoadDir]+“xyz_”+(DT_STR,41252)日期部分(“yyy”, getdate())+右(“0”+(DT_STR,41252)日期部分(“mm”,getdate()), 2) +右(“0”+(DT_STR,41252)日期部分(“dd”,getdate()),2)

  • 将新变量作为ready仅传递给脚本任务(下面使用的是C#),该任务将对文件执行您想要的操作。以下代码是根据从中收集的代码修改的。如果C#不可取,也可以使用在包含系统任务的文件名上枚举的ForEach循环来执行相同的操作

字符串FileWildCard=Dts.Variables[“User::FileWildCard”].Value.ToString(); 字符串[]files=System.IO.Directory.GetFiles(@“\dev01\E$\Data\Proc\Opt”、@FileWildCard+“*.txt”); foreach(文件中的字符串文件) { System.IO.File.Copy(文件@“\dev01\E$\Data\Proc\Opt test\”+System.IO.Path.GetFileName(文件),true); }


请让我知道这是否有帮助。

我的时间戳每天都因文件而异。右行(“0”+(DT_STR,21252)DATEPART(“hh”,GETDATE()),2)+右行(“0”+(DT_STR,21252)DATEPART(“mi”,GETDATE()),2)+右行(“0”+(DT_STR,21252)DATEPART(“ss”,GETDATE()),2)将获得当前时间。我如何配置它以获得每天不断更改的文件名?您的问题令人困惑。起初听起来好像您只想生成一个文件,在文件名中动态地包含时间戳。但现在我不明白了。“将其配置为每天获取不断更改的文件名”是什么意思?生成文件时的“大局”目标是什么?您是否实际上没有生成它,而是试图仅基于日期戳部分从目录中捕获它(忽略时间戳)?是的,我需要从文件夹中获取一个文件,忽略时间戳。在这种情况下,我建议您将文件定义为一个新变量,其值包括j