Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel SSI避免手动更改派生列表达式_Excel_Ssis_Ssis 2008 - Fatal编程技术网

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

Excel SSI避免手动更改派生列表达式,excel,ssis,ssis-2008,Excel,Ssis,Ssis 2008,我有一个SSIS包,需要在一周的第一天运行,源文件来自excel文件,目标是SQL表 当前的过程是手动将excel文件的null值替换为0(这需要很多时间),因此我创建了一个包,目前正在使用派生列表达式“(Column1==”?0:Column1)”,但是excel文件列并不总是与派生列表达式相同,因此每次运行包时,我还必须编辑派生列表达式。我正在寻找一种更好的方法来做这件事,并避免手动操作。提前感谢。在SSI中根本没有简单的内置方法来处理动态列名,更不用说担心派生列转换中的表达式了 使用BiM

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


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

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

使用BiML动态创建SSIS包,该包将基于文件的当前列名导入文件


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

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

步骤:

  • 在SSIS包中创建一个新的字符串类型的全局用户变量,并将其命名为“Day”
  • 例如,在派生列表达式中,将“20151005”替换为新的用户变量。您可以从上面向下拖动它,它看起来像@[user::Day]
  • 现在,要动态填充新变量“Day”,请添加一个SQL脚本,该脚本使用一行的结果集运行以下SQL。在左侧的结果集中,在变量名称列下添加用户变量“Day”。为结果名称指定一个值“0”。在“常规”下,将源类型设置为“直接输入”,并提供以下SQL,该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引用。涉及更多,但可以完成


    希望这能有所帮助。

    如果我理解正确,一周的派生列可能基于Column1,下一周可能是Column2、Column3或其他列?如果是这种情况,您如何知道从一周到下一周应用哪一列?与源Excel工作表中的其他列相比,此列有什么独特之处?我已编辑excel列包含上周的日期,因此第1列是周一(20151005)的日期,第2列(20151006)的日期,等等…然后在目标表中,列是星期一、星期二,直到星期五抱歉,我没有看到任何其他信息。此外,您是否必须每周手动打开派生列任务以更改列源?工作表包含一周中每个工作日(星期一到星期五)的列第1列=星期一,第2列=星期二,第3列=星期三,第4列=星期四,第5列=星期五。每列都包含前一周当天的日期。鉴于此,您将应用什么规则来确定将五列中的哪一列用于派生列?跳过列标题选项?第1列始终是星期一忽略第1行中的值?我应该将SQL脚本放在哪里?填充变量的SQL脚本只需要放在步骤之前的任何位置,该步骤在派生列中应用相同的变量。