使用SSIS在Excel文件中导出值

时间:2014-05-22 05:33:30

标签: sql-server excel ssis

如何将查询命令中的结果集导出到SSIS包中的excel文件中?

一个主要问题是excel datasheet标题名称将在每月更改。

就像在FEB月份一样,excel文件头将是

   Name,Address,FEB,JAN,DEC......

在MAR月份,excel文件标题将会更改,它将变为

   Name,Address,MAR,FEB,JAN,DEC......

我该怎么做?

2 个答案:

答案 0 :(得分:0)

我没有看到一种方法,而不会弄脏并篡改Interop.Excel。

以下是:

  1. 使用例如执行SQL任务将数据集填充到对象变量
  2. 使用脚本任务利用Interop.Excel以编程方式访问您的XLS,将其擦除,从提到的变量中写入新数据并关闭它。顺便说一句,这是您处理动态列列的地方。
  3. 它有点难看,但你会完成你的工作。

    有关示例,请参阅this

答案 1 :(得分:0)

通过给定的方式执行此操作。

<强> prerequesite

1.  I assume that the Excel files come at same location with names as follow.
        JAN14
        FEB14
        MAR14
2.  JAN14 Columns be
        Name,Address,JAN14,DEC14,NOV14
    FEB14 Coulmns be
        Name,Address,FEB14,JAN14,DEC14

使用逻辑

  1. 将所有Excel工作表加载到舞台表格中。
  2. 然后将此阶段表中的每组数据动态加载到适当的表中。

  3. 档案位置 enter image description here

    我创建了一个舞台表,每个excel有2个表。在您的情况下,假设自动化系统负责创建这些表。

    Create table Stg
    (F1 varchar(50), 
    F2 varchar(50), 
    F3 varchar(255),
    F4 varchar(255),
    F5 varchar(255),
    src varchar(50))
    
    Create table Jan14
    (Name varchar(50), 
    Address varchar(50), 
    Jan14 varchar(255),
    Dec13 varchar(255),
    Nov13 varchar(255))
    
    Create table Feb14
    (Name varchar(50), 
    Address varchar(50), 
    Feb14 varchar(255), 
    Jan14 varchar(255),
    Dec13 varchar(255))
    

    SSIS包

    enter image description here

    Excel源连接就像这样

    enter image description here

    For-each循环执行后, Src 数据将是这样的

    Select * from Stg
    

    enter image description here

    最后一个sql任务内容如下。

    Declare @a int = (Select COUNT(Distinct Src) from Stg)
    
    Declare @b table (id int identity(1,1),Src varchar(50))
    Insert into @b 
    Select Distinct Src from Stg
    
    Declare @c int = 1,@d varchar(max)
    
    While @c <= @a
    Begin
        Set @d = 'Insert into ' + (select Src From @b Where id = @c) 
                                + ' Select F1,F2,F3,F4,F5 FROM Stg WHERE Src =''' + 
                                (select Src From @b Where id = @c) + ''' AND F1 != ''Name'''
        Set @c = @c + 1
        Exec(@d)
    End
    

    在程序包执行结束时,我得到了如下结果。

    Select * from [dbo].[Jan14]
    Select * from  [dbo].[Feb14]
    

    enter image description here

    这里遵循的一些约束只是为了方便,例如excel名称与excel的第三列相同,等等。 我希望我们可以使用相同类型的代码实现您想要的结果。