【问题标题】:SSIS Expression wildcardsSSIS 表达式通配符
【发布时间】:2016-12-07 15:02:51
【问题描述】:

我正在尝试创建文件系统任务以将一些备份文件从一台服务器复制到另一台服务器。我遇到的问题是结束字符串是时间戳,因此可以每天更改。

所以我想忽略通过日期的字符。我到目前为止的变量是

"\\\\192.168.100.201\\f\\Backups\\582499_backup_" 
+ (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) 
+".bak"

这会返回

\192.168.100.201\f\Backups\582499_backup_2016_12_07.bak

实际文件名称为 582499_backup_2016_12_07_030001_7282785.bak

所以我需要忽略通过 07 的所有内容。但是我似乎无法让它工作。我试过关注

SQL Central

它报错

[文件系统任务]错误:发生错误并出现以下错误 消息:“找不到文件 '\192.168.100.201\f\Backups\582499_backup_2016_12_07.bak'。”。

【问题讨论】:

标签: ssis ssis-2008


【解决方案1】:

对于我想要处理/移动的不同位置/文件签名等,我通常有不同的变量。请尝试以下操作:

  1. 声明一个名为“文件名”的字符串类型变量,分配任何值,因为它会在运行时动态变化。如果你把它留空,你的文件系统任务会抱怨它被用作源/目标并且是空的(它不知道它会被动态分配)。
  2. 声明一个名为“sourceDir”的变量并赋值“\\192.168.100.201\f\Backups\”(变量为您处理反斜杠转义)
  3. 声明一个名为“destDir”的变量并指定以反斜杠结尾的目标路径,例如 "\\192.168.100.201\f\Destination\"
  4. ForEach 循环容器,转到集合 > 表达式
  5. 将变量@[User::sourceDir] 添加到表达式“目录”中
  6. 将您的自定义表达式添加到表达式“FileSpec”,但以“*.bak”结尾(这将允许文件规范选择文件而忽略文件签名中过去一天的任何内容)

    "582499_backup_" + (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) +".bak"
    
  7. 在变量映射中,将变量 "User::filename" 添加到 index 0

  8. 将文件系统任务添加到 ForEachLoop 容器
  9. 文件系统任务:将变量 "User::destDir" 提供为 "DestinationVariable",将 IsDestinationVariable 设置为 true。
  10. 文件系统任务:将变量 "User::filename" 提供为 "SourceVariable",将 IsSourcePathVariable 设置为 true。
  11. 将您的测试文件放在源目录中并在调试模式下运行。
  12. 您还可以右键单击 ForEachLoop 容器并设置一些断点以查看变量 User::filename 更改 ForEachLoop 枚举器集合中不同文件名的值。
  13. 现在您可以部署您的程序包并创建一个 SQL Server 代理作业来为您的程序包分配一个运行和繁荣的计划。您有一个完全自动化的备份。如果 ForEachLoop Container 没有找到要移动的文件没有问题,它将优雅地退出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2014-06-03
    • 2012-12-01
    • 2013-02-22
    相关资源
    最近更新 更多