SSIS表达式生成器

时间:2017-05-10 19:13:10

标签: ssis package expression builder

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

下面是包的ssis表达式构建器中的表达式 得到我正在使用的文件

 @[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"

现在它无法找到该文件,因为时间戳未包含在内。我如何在这里加入时间戳,因为它每天都不同。

1 个答案:

答案 0 :(得分:0)

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

(DT_STR,4,1252)DATEPART(“yyyy”,GETDATE()) +右(“0”+(DT_STR,2,1252)DATEPART(“mm”,GETDATE()),2) +右(“0”+(DT_STR,2,1252)DATEPART(“dd”,GETDATE()),2)+“_” +右(“0”+(DT_STR,2,1252)DATEPART(“hh”,GETDATE()),2) +右(“0”+(DT_STR,2,1252)DATEPART(“mi”,GETDATE()),2) +右(“0”+(DT_STR,2,1252)DATEPART(“ss”,GETDATE()),2)

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

但是,由于您实际上是尝试从已包含时间戳的目录中捕获文件,并且您只想准备部件但不包括时间戳,使用文件名的第一部分作为通配符,I建议如下:

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

    @ [User :: DataLoadDir] +“xyz _”+(DT_STR,4,1252)DATEPART(“yyyy”, getdate())+ RIGHT(“0”+(DT_STR,4,1252)DATEPART(“mm”,getdate()), 2)+右(“0”+(DT_STR,4,1252)DATEPART(“dd”,getdate()),2)

  • 将新变量仅作为准备好传递给脚本任务(以下是使用C#),该任务将对文件执行所需操作。以下代码是根据C# example收集的代码修改的。如果C#不是优选的,您还可以使用包含系统任务的文件名中枚举的ForEach循环来执行相同的操作。

  

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

如果有帮助,请告诉我。