0

我有一个 SSIS 包,它需要每周的第一天运行,源来自 excel 文件,目标是 SQL 表。

当前的过程是手动将excel文件的空值替换为0,(这需要很多时间),所以我创建了一个包,目前正在使用派生列表达式“(Column1 ==”?0:Column1) ",但 excel 文件列并不总是与派生列表达式相同,因此每次我必须运行包时,我还必须编辑派生列表达式。我正在寻找一种更好的方法来做到这一点,并避免手动进行。提前致谢。

4

2 回答 2

1

根本没有简单的内置方法来处理 SSIS 中的动态列名,更不用说担心派生列转换中的表达式了。

使用 BiML 动态创建 SSIS 包,该包将根据其当前列名导入文件。

GoogleBiML Tutorial开始学习 BiML,祝你好运。

于 2015-10-15T20:48:20.453 回答
1

如果无法让每周创建 Excel 文件的人让他们将五列命名为“星期一”、“星期二”、“星期三”、“星期四”和“星期五”,而不是“20151005”, “20151006”、“20151007”、“20151008”和“20151009”(例如上周申请的),那么可以通过以下步骤完成。

脚步:

  1. 在您的 SSIS 包中创建一个字符串类型的新全局用户变量,并将其命名为“Day”。
  2. 在您的派生列表达式中,例如将“20151005”替换为新的用户变量。你可以把它从上面拖下来,它看起来像@[user::Day]。
  3. 现在要动态填充新变量“Day”,添加一个 SQL 脚本,该脚本使用单行的 ResultSet 运行以下 SQL。在左侧的结果集中,在变量名称列下添加您的用户变量“Day”。将结果名称的值设为“0”。在 General 下,将 Source Type 设置为 Direct Input 并提供以下 SQL,它将以 yyyymmdd 格式返回前一周星期一的日期值。

    declare @date as datetime 
    set @date = dateadd(week, datediff(week, 0, getdate()-7), 0) 
    select cast(year(@date) as char(4)) + right('00' + convert(varchar(2), month(@date)), 2) + right('00' + convert(varchar(2), day(@date)), 2)
    

这里的关键是您可以在下一周的任何一天运行 SSIS 包,它将捕获前一周星期一的此信息。但是如果你跳过一个星期,它将寻找一个不再存在的列。应用 SQL 脚本来捕获前一周星期一的日期的替代方法是直接从工作表中读取第一列,这会变得很复杂,因为它涉及使用 Visual Basic 或 C# 的脚本任务......需要Excel 参考资料。更多的参与,但可以做到。

希望这可以帮助。

于 2015-10-15T22:19:17.677 回答