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

Ste*_*nie 5 sql-server excel expression ssis etl

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

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

Foreach Loop Container 设置: Foreach ADO Enumerator,ADO Object 源变量 - FileNameObj,变量映射 -FileName和索引 - 0。在数据流任务下,我添加了一个 OLE DB Source 和 Excel Destination 指向文件路径:C:\Test\ABC.xlsx

这是连接管理器属性:

连接字符串Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\ABC.xlsx;Extended Properties="Excel 12.0;HDR=YES";

延迟验证设置为True

ExcelFilePathC:\Test\ABC.xlsx

然后我用 PropertyExcelFilePath和 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";

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

数据流任务 [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

Had*_*adi 1

动态 Excel 连接字符串

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

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

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

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

  1. 所有 Excel 文件必须具有相同的结构,否则此包将始终失败
  2. 将数据流任务Delay Validation属性设置为True

参考


更新1

您应该尝试很多事情:

  1. 安装 Access 数据库引擎

下载链接:Microsoft Access 数据库引擎 2010 可再发行组件

  1. 以 32 位模式运行包

在项目属性中,将 64 位运行时属性更改为 False

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

  2. filepath为变量分配默认值