如何将数据从SQL表导出到SSIS中的多个excel文件?

时间:2018-01-24 00:05:55

标签: sql-server excel ssis expression etl

我创建了一个SSIS包,它从SQL中提取数据并将其加载到excel中。我有问题使这个包动态化并将数据加载到多个excel文件中。

我首先创建了一个执行SQL任务,该任务包含所有带有SQL代码的文件名:SELECT FileName FROM Files,其结果集将存储在变量FileNameObj中。然后我创建了一个Foreach循环容器并在里面添加了一个数据流任务。

Foreach循环容器设置: Foreach ADO枚举器,ADO对象源变量 - FileNameObj,变量映射 - FileName和索引 - 0.在数据流任务下,我有添加了指向文件路径的OLE DB源和Excel目标:C:\Test\ABC.xlsx

以下是连接管理器属性:

ConnectionString Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\ABC.xlsx;Extended Properties="Excel 12.0;HDR=YES";

DelayValidation 设置为True

ExcelFilePath C:\Test\ABC.xlsx

然后我创建了一个包含Property ExcelFilePath和Expression:"C:\\Test\\"+ @[User::FileName]+".xlsx"的表达式 然后我的 ConnectionString 更改为:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\.xlsx;Extended Properties="Excel 12.0;HDR=YES";

我已经在测试文件夹中创建了所有文件模板(所有文件都相同)。我收到以下错误:

  

数据流任务错误[Excel目标[131]]:SSIS错误代码DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:0x80040E37。

     

数据流任务时出错[Excel目的地[131]]:打开" Sheet1 $"的行集。失败。检查数据库中是否存在该对象。

     

HRESULT的异常:0xC02020E8(Microsoft.SqlServer.DTSPipelineWrap)

我做错了什么?或者甚至可以在SSIS中执行此操作?

1

2

3]

4]

5]

6]

7]

8]

9]

10

11

12

3 个答案:

答案 0 :(得分:2)

见这里:Dynamically assign filename to excel connection string

使用ExcelFilePath,而不是ConnectionString

只是为了澄清:

  • 如果要将具有相同列的相同数据加载到多个Excel工作表中,则只需导出一次并对文档执行文件复制就会容易得多
  • 如果每个工作表都有不同的列,那么这不会起作用 - 每次运行时,每个数据流都需要具有相同的列

  • 如果您要加载相同的列但不同的过滤数据,那么您可能需要考虑为什么要这样做。是否要克服excel中的行限制?如果是这样,请导出为CSV。它是否为用户生成自定义报告?请考虑使用报告工具。

答案 1 :(得分:1)

更新1

你应该尝试很多事情:

  1. 安装Access数据库引擎
  2. 下载链接:Microsoft Access Database Engine 2010 Redistributable

    1. 以32位模式运行程序包
    2. 在“项目”属性中,将64位运行时属性更改为False

      1. 检查所有模板中是否存在Sheet1

      2. 为文件路径变量指定默认值

      3. 初步答案

        动态Excel连接字符串

        首先,.XLSX格式的excel连接字符串如下所示:

        "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Test\\"+ @[User::FileName]+ ".xlsx; Extended Properties=\"Excel 12.0 Xml;HDR=YES\";"
        

        推荐的方式是(@ Nick.McDermaid提到的),将值赋给ExcelFilePath属性

        但你必须考虑许多其他事情:

        1. 所有excel文件必须具有相同的结构,如果不是此包将始终失败
        2. 将数据流任务Delay Validation属性设置为True
        3. <强>参考

答案 2 :(得分:1)

我找到了解决自己问题的方法:为FileName变量分配默认值。我分配了ABC并且它有效。按预期生成两个文件,一个用于ABC,一个用于DEF。