我有一个名为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"
现在它无法找到该文件,因为时间戳未包含在内。我如何在这里加入时间戳,因为它每天都不同。
答案 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); }
如果有帮助,请告诉我。