SSIS避免手动更改派生列表达式

时间:2015-10-15 19:26:39

标签: excel ssis ssis-2008

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

步骤:

  1. 在SSIS包中创建一个类型为string的新全局用户变量,并将其称为“Day”。
  2. 在派生列表达式中,例如使用新用户变量替换“20151005”。你可以从上面向下拖动它,它看起来像@ [user :: Day]。
  3. 现在要动态填充新的变量“Day”,添加一个SQL脚本,该脚本使用单行的ResultSet运行以下SQL。在左侧的结果集中,在“变量名称”列下添加用户变量“日期”。将结果名称赋值为“0”。在“常规”下,将“源类型”设置为“直接输入”,并提供以下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)
    
  4. 这里的关键是你可以在下周的任何一天运行SSIS包,它将捕获前一周的星期一的这些信息。但如果你跳过一周,它将寻找一个不再存在的列。应用SQL脚本捕获上周星期一的日期的替代方法是直接从工作表中读取第一列,这变得很复杂,因为它涉及使用Visual Basic或C#的脚本任务而不是...... Excel引用。更多涉及但可以做到。

    希望这有帮助。