【问题标题】:SSIS Expression BuilderSSIS 表达式生成器
【发布时间】:2017-05-10 19:13:10
【问题描述】:

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

下面是 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"

目前无法找到该文件,因为不包括时间戳。我如何在此处包含时间戳,因为它每天都不一样。

【问题讨论】:

    标签: ssis package expression builder


    【解决方案1】:

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

    (DT_STR, 4, 1252) DATEPART("yyyy" , GETDATE()) + RIGHT("0" + (DT_STR, 2, 1252) DATEPART("mm" , GETDATE()), 2) + RIGHT("0" + (DT_STR, 2, 1252) DATEPART("dd" , GETDATE()), 2) + "_" + RIGHT("0" + (DT_STR, 2, 1252) DATEPART("hh" , GETDATE()), 2) + RIGHT("0" + (DT_STR, 2, 1252) DATEPART("mi" , GETDATE()), 2) + RIGHT("0" + (DT_STR, 2, 1252) DATEPART("ss" , GETDATE()), 2)

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

    但是,由于您实际上是在尝试从已经包含时间戳的目录中捕获文件,并且您只想准备直到但不包括时间戳的部分,因此使用文件名的第一部分作为通配符,我推荐以下:

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

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

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

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

    如果这有帮助,请告诉我。

    【讨论】:

    • 我的文件时间戳每天都在变化。行 RIGHT("0" + (DT_STR, 2, 1252) DATEPART("hh" , GETDATE()), 2) + RIGHT("0" + (DT_STR, 2, 1252) DATEPART("mi" , GETDATE( )), 2) + RIGHT("0" + (DT_STR, 2, 1252) DATEPART("ss" , GETDATE()), 2) 会给我当前时间。我如何配置它以获取每天更改的文件名
    • 您的问题令人困惑。最初听起来好像您只想生成一个在文件名中动态包含时间戳的文件。但现在我不明白。您是什么意思“配置它以获取每天更改的文件名”?生成文件的“大图”目标是什么?您实际上不是在生成它,而是试图从仅基于日期戳部分的目录中捕获它(忽略时间戳)?
    • 是的,我需要从忽略时间戳的文件夹中获取文件
    • 在这种情况下,我建议您将文件定义为一个新变量,其值仅包括它的第一部分(导致时间戳的所有内容,但不包括它)。将该变量传递给脚本任务 (C#) 并将其用作通配符,如下面的链接所示,其中复制了一个或多个文件。为了更清楚地说明,我将更新我之前的答案。 social.technet.microsoft.com/Forums/sqlserver/en-US/…
    猜你喜欢
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多